超线程应使用多少个 CPU?

超线程应使用多少个 CPU?

假设我有一个具有 18 个核心的服务器 CPU,并且启用了超线程,这意味着我可以在 htop 中看到 36 个 CPU。

为了充分利用 CPU 并且不影响单线程性能,我是否应该让所有 36 个“核心”都以 100% 的效率运行,而 HT 核心只会执行较少的工作但仍然报告 100%,或者这是否意味着“完整”核心已经被其“HT 核心”上的任务打断,从而减少单线程工作?

我知道有很多变量会影响 HT 性能,我只是想知道处理 HT 时 CPU 计量器的含义。

答案1

如果允许第二个虚拟核心在第一个虚拟核心卡住的情况下做出贡献,那么效果会更好不是,这样你(至少)可以完成一点额外的工作。

问题是:何时拥有两个不同的线程会导致其中一个线程运行得更差?指令之间的分支预测和依赖关系不会改变。现在等待内存访问……两个线程在缓存利用率和带宽方面争夺内存访问权。

如果您有部分 CPU 使用 HT 运行,而其他 CPU 没有,这是否也意味着您将为其中一种类型分配特定线程?我认为不是:您的程序将在随机虚拟核心上运行其线程。那么拆分配置有何帮助?由于每个 CPU 都有自己的缓存,因此唯一的影响是由于内存带宽和缓存一致性的负担。

一般来说,你会达到这样的程度具有你可以做的更多的事情比让一些 CPU 执行单元闲置更昂贵。这并不直接取决于线程数,而是取决于线程正在做什么,以及各个组件的详细内存架构和性能细微差别。

没有简单的答案。即使有特定的程序,机器也可能与人们讲述自己经历的程序有所不同。

你必须亲自尝试一下措施哪种方式最快,在特定机器上执行特定工作。即便如此,随着时间的推移,软件更新和使用情况的变化也可能会发生变化。

看一眼愤怒的第三卷代表作。如果您仔细观察某个特定的处理器,您会发现在执行代码所需的许多步骤的深层管道中资源有限。您需要找到一种情况,即过度承诺导致其执行速度变慢,而不是不承担更多工作。一般来说,这意味着某种缓存;并且资源在线程之间共享。


CPU 计量器的含义是什么:它报告未用于运行空闲线程的所有时间。分配给一个核心的两个逻辑线程都不会空闲,即使其中一个线程上的实际工作可能很小。管道卡住几个周期直到结果准备就绪、内存被提取、原子操作被隔离等所花费的时间同样不会导致线程被搁置为“未准备好”,因此它不会空闲,并且时间仍然显示为正在使用中。等待 RAM 不会显示为空闲。只有像 I/O 这样的操作才会使线程阻塞并停止为其充电时间。操作系统互斥锁通常会这样做,随着多核系统的兴起,这不再是一件确定的事情,因为“自旋锁”将不是让线程回到架子上。

因此,如果 CPU 经常卡在等待内存,则 CPU 计量表显示 100% 并不意味着一切顺利。显示 90% 的逻辑核心数量较少,很可能正在完成更多工作,因为它完成数字运算现在正在磁盘上等待。

所以不要担心 CPU 计量表。看看实际的进度,仅有的

答案2

CPU 计量器无法告诉您超线程 CPU 的性能提升幅度有多大。为此,您应该以各种物理核心超额订阅率运行自己的基准测试。有些工作负载在完全关闭超线程的情况下效果最佳,因此也请将这种情况纳入测试中。它可能是 1:2(36 个并行工作器),或 1:1.5,甚至 1:2.5!这取决于您的工作负载。

更详细地说,HT 在硅片上的实现方式可以减少处理器在需要切换上下文或分支预测失败时处于空闲状态的时间。与纯操作系统技巧相比,这更容易实现 100% 的执行单元使用率。自推出以来,HT 一直在不断发展,现代芯片上的并行性比我们 10 年前使用的芯片更高。

有两个执行配置文件会影响您的最佳超额认购点:

  • 执行持续时间长。如果您的工作人员在回收之前运行了几分钟或几小时,例如大型渲染作业或环境建模,您将获得每个工作人员更高效的单核性能。这会降低您的比率。
  • 执行时间短。如果您的工作线程以秒或分钟为单位循环,例如 Web 应用线程,则启动新进程所涉及的开销意味着您的比率会更高。

答案3

您应该看到所有 36 个核心都以 100% 的运行 - 假设软件可以做到这一点(这并不简单 - 对于那么多的核心,调度可能会很棘手,因此低于 100% 是可以接受的)。

显然,当您使用超线程“分割”矿石时,这 200% 的含义不是“2x100% - 完成的工作”。但这在任何测量中都是不可见的(来自 CPU 利用率,没有完成的工作的概念)。完成多少工作取决于工作是什么 - 大多数情况下,在没有超线程的情况下,预计工作量会超过 1.5 倍。

答案4

超线程的实现方式因特定 CPU 架构而异。从 Nehalem 到 Skylake,英特尔大大减少了管道中固定比例(即 50/50)的共享部分,转向动态共享结构。

无论如何,一般来说,启用 HT 会导致单线程执行速度略慢,但由于 Linux 调度程序的工作方式,这种情况仅当正在运行的线程数量为更高而不是物理核心数。在这种情况下(线程数 > 核心数),您通常会将总吞吐量视为最重要的因素,因此超线程仍然是净胜。

这是如何实现的?关键点在于,CPU 不会将物理核心和虚拟核心视为同等核心,而是以某种方式公开后者,以便 Linux 调度程序在有其他物理核心可用时可以避免在其上进行调度。换句话说,它首先使用所有物理核心,然后它开始使用虚拟的。

这意味着,通常情况下,超线程是一项非常有价值的功能(其他处理器,如 Power8,使用更深的 SMT 技术),为了最大限度地提高吞吐量,您应该启用它,为每个虚拟或物理核心至少加载一个线程。举个实际的例子,要从 18 核 CPU 中获得全部性能,您应该至少使用 36 个线程。

存在两个例外:

  1. 如果你只想最小化有限线程集(线程数 < 物理核心)的延迟,你可以禁用 HT
  2. 非常老旧的 CPU(Pentium4 和小得多的 Nehalem)具有不灵活的分区规则,这些规则迫使 CPU 以 50/50 的比例分割许多关键资源,而不受第二个线程的状态/负载的影响。在这种情况下,您必须对您的用例进行基准测试,以确保增加的吞吐量值得显著降低的单线程性能。

相关内容