我一直对超线程以及应用程序如何从中受益感兴趣。据我所知,超线程由操作系统直接管理,它与每个核心上运行的虚拟线程如何访问每个核心上的共享执行单元有关。大多数帖子都建议你不必关心它,而应该让操作系统来管理它。
我对这个答案还算满意,直到我在一个游戏中遇到了一个让我完全失望的设置。有一款名为 Arma 3 的游戏,其选项中有一个“超线程”设置。我费了一番功夫在 Google 上搜索,偶然发现了开发人员的一篇文章,解释了该设置的作用。他说的正是这个
它的作用是告诉引擎仅将 HT 核心用于具有次要任务/微作业的线程...只需记住 -cpuCount= 否定 -enableHT
现在,从我读到的有关 HT 及其工作原理的内容来看,应该没有任何直接的方法可以告诉应用程序使用超线程。显然,引擎内部的设置“发挥了某种魔力”,告诉应用程序使用 HT 执行特定任务。
有人能帮我解释一下吗?因为说实话这很令人困惑。谢谢。
答案1
要解释超线程有何帮助,首先需要解释它到底是什么,以及处理器中资源是如何共享的。
背景
传统的多核 CPU 在内核之间共享的内部资源非常少。在大多数旧情况下,内核之间仅共享 L3(如果存在 L4 缓存,也可能共享)缓存,其他所有内容都是每个内核独有的。由于计算机的工作方式,这最终导致内核的大部分部分实际上并未被在其上执行的每条指令所使用。
超线程技术就是为了解决这种低效率问题。其基本思想是,通过在两个(或更多)内核之间共享大量资源,您可以使用更少的空间(和功率)完成几乎相同的工作量。当然,这种技术的限制在于,您无法真正运行在物理内核数量等于总线程数的 CPU 上所能运行的 100% 的性能。
可能值得注意的是超线程不是与其他一些 CPU 架构(POWER、SPARC 和(可能)AMD 的 Ryzen 芯片)提供的对称多线程相同。SMT 更接近经典的多核设计,并且不会遇到超线程遇到的大多数问题。
那么,如果你不能在所有核心上运行任何东西,那它到底有什么用呢?
嗯,这实际上很难说。为了获得最大的好处,您实际上必须将相似的代码分组到共享 CPU 内部资源的线程对上),但即便如此,也很难确定超线程是否真的会有很大帮助。一些较旧的操作系统根本没有进行这种分组,其结果仍然被认为是“病态糟糕”这一短语的典型例子。较新的系统会进行一定程度的分组,但仍然不完美。
I/O 密集型任务(例如,Web 服务器和数据库)实际上倾向于从超线程中至少受益一些,但它们受益多少取决于它们到底在做什么,并且它们是少数具有合理明确益处的案例之一。
然而,众所周知,哪些类型的工作负载更差使用 SMT。几乎所有需要在 100% 负载下使用 CPU 所有核心的东西都不会从 SMT 中获得太多好处,如果有的话。在 HT 芯片上,它实际上有时会比关闭 HT 时运行得更慢。在其他一些实现中,它可能会或可能不会改善情况或使情况变得更糟,这取决于正在执行的操作(例如,SPARC 芯片在此类工作负载下表现良好,前提是它们不执行真正深度嵌套的函数调用)。
好的,那么 Arma 3 是怎么回事呢?
如上所述,如果您没有在每个核心上合理地分组,超线程可能会对您的性能造成非常糟糕的影响。进行分组所需的逻辑通常特定于特定软件。前面提到的 Arma 3 开关只是控制此逻辑是否打开。现在,至于为什么它没有自动检测到,我不太清楚(并不是很难弄清楚是否使用了超线程)。