有人可以向我推荐一些文档来说明多CPU,多核和超线程之间的区别吗?我总是对这些差异以及每种架构在不同场景中的优缺点感到困惑。
编辑:这是我在网上学习并从别人的评论中学习后的当前理解;有人可以评论评论吗?答案 0 :(得分:82)
多CPU是第一个版本:你有一个或多个带有一个或多个CPU芯片的主板。这里的主要问题是CPU必须将一些内部数据暴露给另一个CPU,这样它们就不会妨碍它们。
下一步是超线程。主板上有一个芯片,但内部有两个部分,因此它可以同时执行两条指令。
目前的发展是多核的。它基本上是最初的想法(几个完整的CPU),但在一个芯片中。优点:芯片设计人员可以轻松地将用于同步信号的附加线路放入芯片中(而不是将其连接到引脚上,然后通过拥挤的主板并将其连接到第二个芯片)。
今天的超级计算机是多CPU,多核:它们有很多主板,通常有2-4个CPU,每个CPU都是多核的,每个都有自己的RAM。
[编辑]你得到的非常正确。只是几个小问题:
超线程在单个内核中同时跟踪两个上下文,从而为无序CPU内核提供更多并行性。这使得执行单元保持工作,即使一个线程在高速缓存未命中,分支错误预测或等待来自高延迟指令的结果时停止。这是一种在不复制大量硬件的情况下获得更多总吞吐量的方法,但如果有的话,它会单独减慢每个线程的速度。 See this Q&A for more details,以及对本段先前措辞出现问题的解释。
多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以上
如果你拥有一个芯片内的所有东西,信号运行得更快,你可以拥有你喜欢的数量(好吧,差不多:)。此外,信号串扰更容易控制。
答案 1 :(得分:4)
您可以在Intel's website或Yale University的简短文章中找到一些有关双CPU,多核和超线程的有趣文章。
我希望你能在这里找到你需要的所有信息。
答案 2 :(得分:2)
简而言之:多CPU或多处理器系统有多个处理器。多核系统是一个多处理器系统,在同一个芯片上有几个处理器。在超线程中,多个线程可以在同一个处理器上运行(即这些多个线程之间的上下文切换时间非常短)。
多处理器已经存在了30年,但主要是在实验室中。多核是新兴的多处理器。如今的服务器处理器与多处理器一起实现超线程。
关于这些主题的维基百科文章非常具有说明性。