多CPU是第一个版本:您将有一个或多个主板上装有一个或多个CPU芯片。这里的主要问题是,CPU必须将其内部数据的一部分暴露给另一个CPU,这样才不会妨碍他们。
下一步是超线程。主板上有一个芯片,但内部有一些部件两次,因此可以同时执行两条指令。
当前的发展是多核的。这基本上是最初的想法(几个完整的CPU),但在单个芯片中。优点:芯片设计人员可以轻松地将用于同步信号的其他导线放入芯片中(而不是必须将它们通过引脚引出,然后通过拥挤的主板并向上延伸到第二个芯片)。
当今的超级计算机是多CPU多核的:它们有很多主板,板上通常装有2-4个CPU,每个CPU是多核的,每个都有自己的RAM。
[编辑]您完全正确。几点要点:
超线程在单个内核中一次跟踪两个上下文,从而为乱序的CPU内核提供了更多的并行性。即使一个线程因高速缓存未命中,分支错误预测或等待高延迟指令的结果而停滞,这也使执行单元保持工作量。这是一种无需复制大量硬件即可获得更高总吞吐量的方法,但是如果有的话,它会分别降低每个线程的速度。 有关更多详细信息,请参见此问答,以及对本段以前的措词有何解释。
多CPU的主要问题是在它们上运行的代码最终将访问RAM。有N个CPU,但只有一根总线可以访问RAM。因此,您必须具有一些硬件,以确保a)每个CPU获得相当数量的RAM访问,b)访问RAM的相同部分不会引起问题,并且c)最重要的是,将通知CPU 2当CPU 1写入CPU 2在其内部高速缓存中具有的某个内存地址时。如果没有发生,CPU 2将愉快地使用缓存的值,而忽略了它已过时的事实
试想一下,您在列表中有任务,并且想要将其分散到所有可用的CPU中。因此,CPU 1将从列表中获取第一个元素并更新指针。CPU 2将执行相同的操作。出于效率方面的考虑,两个CPU不仅将少量字节复制到高速缓存中,还将整个“高速缓存行”(无论可能是什么)复制。假设是,当您读取字节X时,您很快也会读取X + 1。
现在,两个CPU在其缓存中都有内存的副本。然后,CPU 1将从列表中获取下一项。如果没有高速缓存同步,它也不会注意到CPU 2也更改了该列表,并且它将开始与CPU 2在同一项目上工作。
这实际上使多CPU变得如此复杂。如果整个代码仅在单个CPU上运行,则这种副作用会导致性能比您得到的性能差。解决方案是多核的:您可以轻松地添加所需数量的连线以同步缓存;从一个高速缓存(更新你甚至可以将数据复制到另一个部分,而无需刷新和重新加载缓存线的),等等,或者缓存逻辑可以确保所有的CPU获得相同的缓存行,当他们访问的同一部分真正的RAM,只需将CPU 2阻塞几纳秒,直到CPU 1进行更改。
[EDIT2]多核比multi-cpu更简单的主要原因是,在主板上,您根本无法在需要使同步有效的两个芯片之间进行所有布线。另外,信号仅在30cm / ns的顶部传播(光速;在电线中通常要少得多)。而且不要忘记,在多层主板上,信号开始相互影响(串扰)。我们喜欢认为0是0V,1是5V,但实际上,“ 0”介于-0.5V(从1-> 0断开线时为过驱动)和.5V之间,而“ 1”则高于0.8V。
如果您将所有内容都放在一个芯片中,则信号的运行速度将大大提高,并且您可以拥有任意数量的信号(嗯,几乎是:)。而且,信号串扰更容易控制。