有人可以向我推荐一些文档来说明多CPU,多核和超线程之间的区别吗?我总是对这些差异以及不同场景中每个架构的优缺点感到困惑.
编辑:这是我在网上学习并从别人的评论中学习后的当前理解; 有人可以评论评论吗?
我认为超线程是其中最劣质的技术,但价格便宜.其主要思想是重复寄存器以节省上下文切换时间;
多处理器优于超线程,但由于不同的CPU位于不同的芯片上,不同CPU之间的通信延迟比多核更长,并且使用多个芯片,与多核相比,费用更高,功耗更高;
多核将所有CPU集成在一个芯片上,因此与多处理器相比,不同CPU之间的通信延迟大大降低.由于它使用一个芯片来容纳所有CPU,因此它消耗的功率更低,并且比多处理器系统便宜.
乔治,提前谢谢
多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]多核比多CPU更简单的主要原因是在主板上,你根本无法在两个芯片之间运行所有需要同步的芯片.另外一个信号只能以30厘米/秒的速度传播(光速;在电线中,通常会少得多).不要忘记,在多层主板上,信号开始相互影响(串扰).我们认为0是0V而1是5V,但实际上,"0"是介于-0.5V(从1-> 0下降线时过驱动)和.5V以及"1"高于0.8V之间.
如果你有一个芯片内部的所有东西,信号运行得更快,你可以拥有任意多的(好吧,差不多:).此外,信号串扰更容易控制.