我感兴趣的是超线程感知如何影响线程在逻辑和物理核心上的调度,例如,它是否将来自同一进程的线程放在一起以从缓存共享中受益,它是否分离那些它以某种方式知道会争夺大量核心资源的线程,它是否将计算密集型线程与 I/O 密集型线程结合在一起,等等。
我谷歌了一下“调度程序如何处理逻辑核心”。 我并没有寻求人工智能的答案,但谷歌搜索结果给出了人工智能的答案:不了解超线程的调度程序将逻辑核心与物理核心同等对待。在多核 CPU 中,如果假设只有两个线程要运行,那么缺乏超线程意识可能会导致将两个线程都调度到同一个物理核心上。这会使一个核心过于繁忙并延迟线程任务的完成。
然而,这只是谷歌的人工智能。如果要让它具有可信度,那么它需要证实。 人工智能的回应似乎暗示,支持超线程的调度程序更愿意将线程分散到不同的物理处理器上,并且只有在没有更多物理处理器时才将它们加倍。 这是真的吗?我在哪里可以找到这些信息?
我很好奇这种超线程感知偏好的真实性,即把线程分散到不同的物理核心上,这是有原因的。 在典型的计算机上,有数千个线程等待运行。 这比逻辑和物理处理器的数量要多很多倍,甚至要多几个数量级。 这不仅仅是一个人工智能的答案,所以似乎除了非常具体的科学计算应用程序之外,避免将线程加倍到物理核心上没有任何好处。 这是正确的吗,还是我遗漏了什么?
最终,我试图了解超线程意识如何改善调度。 根据我目前能够找到的信息,很可能它没有改善调度。但是,我不是计算机科学家——我只需要学习多线程来使我的软件组件线程安全,因为主机应用程序确实使用超线程。
PS:我已经在网上浏览超线程页面好几天了,所以我实际上并不是在询问多线程、SMT 的基础知识、超线程是什么、超标量或类似的背景知识。
超线程在两个线程之间共享一个 CPU 核心。这意味着这两个线程都需要共享缓存、核心资源和执行单元。当您仅使用其中一个超线程核心时,这意味着可以更好地将缓存和资源分配给正在运行的线程。
简单地说,如果您有 4 件事要做,并且有 4 个超线程核心,因此您只需要4 个核心,那么通过使用“完整”核心并避免每个核心上的第二个(超)线程将获得最佳性能。
需要澄清的是,超线程并不等于每个核心的性能提升 100%。一个老例子是,超线程可以根据任务额外提高 30% 的性能。在单个超线程核心上运行两个任务仅相当于 1.3 个处理器。
另一种方法是在两个“满载”处理器上运行两个任务,假设没有内存或其他限制,这样可以充分发挥两个核心的性能。两个任务将真正同时运行,而不是共享执行资源。
因此需要澄清的是:
因此,您绝对希望在可能的情况下让单个任务在“完整”核心上运行。
这就是超线程感知调度程序的作用所在。
它会优先在每个核心上安排任务,然后仅在必要时通过超线程使用剩余的核心资源。
忽略“I/O”和其他特性,在进程之间,每个核心基本相同,内存和硬盘的速度也相同。“共置”进程没有任何好处,因为当它们执行内存或其他硬件请求时,无论它们位于哪个核心上,它们都会看到相同的限制。