multicore - 多CPU、多核和超线程有什么区别?

标签 multicore smp hyperthreading

谁能向我解释多 CPU、多核和超线程之间的区别?我总是对这些差异以及每种架构在不同场景中的优缺点感到困惑。
这是我在网上学习并从其他人的评论中学习后的当前理解。

  • 我认为超线程是其中最差的技术,但价格便宜。其主要思想是重复寄存器以节省上下文切换时间;
  • 多处理器比超线程好,但是由于不同的CPU在不同的芯片上,不同CPU之间的通信比多核的延迟要长,而且使用多芯片比多核成本更高,功耗也更大;
  • 多核将所有 CPU 集成在一个芯片上,因此与多处理器相比,不同 CPU 之间的通信延迟大大降低。由于它使用单个芯片来包含所有 CPU,因此与多处理器系统相比,它消耗的功率更少且成本更低。

  • 这是正确的吗?

    最佳答案

    多 CPU 是第一个版本:您将拥有一个或多个带有一个或多个 CPU 芯片的主板。这里的主要问题是 CPU 必须将它们的一些内部数据暴露给另一个 CPU,这样它们就不会妨碍它们。

    下一步是超线程。主板上的一个芯片,但它内部有一些部件,所以它可以同时执行两条指令。

    目前的发展是多核的。它基本上是最初的想法(几个完整的 CPU),但在单个芯片中。优点:芯片设计人员可以轻松地将用于同步信号的额外电线放入芯片中(而不必将它们布线到引脚上,然后穿过拥挤的主板并向上进入第二个芯片)。

    今天的 super 计算机是多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 的值。

    如果你把所有东西都放在一个芯片里,信号运行得更快,你可以拥有任意数量的(嗯,几乎:)。此外,信号串扰更容易控制。

    关于multicore - 多CPU、多核和超线程有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/680684/

    相关文章:

    java - jvm如何使用多核cpu资源?

    c - 用户空间代码以什么顺序执行?

    multithreading - 有没有办法强制两个线程在同一个核心上执行?

    java - 如何保证一个线程在另一个CORE中执行?

    ruby - 有什么方法可以找到 MRI Ruby 中的 CPU 内核数量(可能使用 C 扩展)?

    django - Django Haystack 中使用 Solr 后端的多核

    linux-kernel - Linux 中 x86 架构的 IPI 种类

    linux - 在 linux 中启动 cpus 时使用 pen_release 的基本概念是什么

    c++ - 多线程程序中映射模式的性能低于预期(4 倍加速比 8 倍)

    linux - 最大 CPU 使用率(最大允许 CPU 使用率)