![超线程的工作原理](https://linux22.com/image/1573684/%E8%B6%85%E7%BA%BF%E7%A8%8B%E7%9A%84%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86.png)
过去有一种称为超线程的技术,其中单个 CPU 核心可以充当两个核心。
但是,是否可以将两个 CPU 核心合并为一个,以提高不能充分利用多个核心的程序的性能?(从旧游戏到 X Plane 11)
答案1
简短回答:不。
稍微长一点的答案:多核芯片上的内核基本上是独立的物理处理器。超线程允许您将一个物理内核拆分为两个线程。这样做的好处是,单个内核可以在线程之间来回切换,这样当一个线程正在等待(例如等待 I/O)时,另一个线程就可以恢复。一个超线程内核上的两个线程共享资源,从而实现线程之间非常高效的上下文切换。
那么为什么不能反其道而行呢?想象一下。您有两个物理核心,但只有一个进程。有两种可能的情况:
执行代码可以并行运行。在这种情况下,您只需要两个线程,每个核心一个。这样,两个线程就可以同时运行。
执行代码无法并行运行。这就是您要问的。在这种情况下,您有一个单线程。由于代码无法并行运行,因此您无法同时在两个单独的处理器上运行它。要在两个内核上运行单个线程,您只需在两个内核之间来回切换线程即可。这不会带来任何性能提升,事实上,由于不必要的上下文切换,性能会受到影响。
这是多核系统的一个不幸缺点;只有当应用程序可以并行执行多个任务并且被编写为这样做时,您才能看到性能提升。即便如此,增益也不与内核数量成正比(参见阿姆达尔定律)。
答案2
不,不是真的
无论如何,你都必须并行化这些指令,而其中许多指令都依赖于其他指令的结果 [1]。除此之外,算术单元(真正进行计算的大脑)通常不是瓶颈。
要访问和计算数据,必须先存储它们。为了加快速度,有多个内存层(寄存器、缓存(1、2、3 级)、RAM)。两个核心(在 x86 处理器中)通常只共享 RAM(可能还有 L3 缓存)。因此,您不能简单地拆分程序,因为另一半将拥有所需的数据。
超线程的工作原理
超线程正在利用计算单元等待其他东西的时间。
从 RAM 加载一个值需要很长时间(据我所知大约需要 500 个 CPU 周期)。在这段时间内,当算术单元通常不执行任何操作时,超线程会在同一核心上运行第二个进程。
[1] 这也是推测执行试图提供帮助的地方。但也许会造成一些安全漏洞(Spectre 和 Meltdown)