11

HT/SMT 背后的主要思想是,当一个线程停止时,同一内核上的另一个线程可以选择该内核的剩余空闲时间并透明地运行。

2013 年,英特尔放弃了 SMT,转而支持其 Silvermont 处理器内核的乱序执行,因为他们发现这可以提供更好的性能。

ARM 不再支持 SMT(出于能源原因)。AMD 从不支持它。在野外,我们仍然有各种支持它的处理器。

从我的角度来看,如果构建数据和算法是为了不惜一切代价避免缓存未命中和后续处理停滞,那么 HT 肯定是多核系统中的冗余因素吗?虽然我很欣赏由于两个超线程的离散硬件存在于同一个物理内核中,所涉及的上下文切换开销很低,但我看不出这总比没有上下文切换要好。

我建议对超线程的任何需求都指向有缺陷的软件设计。我在这里有什么遗漏吗?

4

5 回答 5

10

超线程是否有帮助以及在多大程度上取决于线程在做什么。这不仅仅是在一个线程中工作,而另一个线程等待 I/O 或缓存未命中 - 尽管这是基本原理的重要组成部分。它是关于有效地使用 CPU 资源来增加总系统吞吐量。假设你有两个线程

  1. 一个有很多数据缓存未命中(空间局部性差)并且不使用浮点,空间局部性差不一定是程序员做得不好,有些工作负载天生就是这样。
  2. 另一个线程正在从内存中流式传输数据并进行浮点计算

使用超线程,这两个线程可以共享同一个 CPU,一个是执行整数运算并获取缓存未命中和停顿,另一个是使用浮点单元,数据预取器可以提前预测来自内存的顺序数据。系统吞吐量优于操作系统在同一个 CPU 内核上交替调度两个线程的情况。

英特尔选择不在 Silvermont 中包含超线程,但这并不意味着它将在高端 Xeon 服务器处理器甚至针对笔记本电脑的处理器中取消它。为处理器选择微架构涉及权衡,有很多考虑因素:

  1. 目标市场是什么(将运行什么样的应用程序)?
  2. 目标晶体管技术是什么?
  3. 绩效目标是什么?
  4. 什么是功率预算?
  5. 目标芯片尺寸是多少(影响良率)?
  6. 它在公司未来产品的性价比范围内处于什么位置?
  7. 目标发布日期是什么时候?
  8. 有多少资源可用于实施和验证设计?添加微架构功能会增加非线性的复杂性,与其他功能存在微妙的交互,目标是在第一次“流片”之前识别尽可能多的错误,以最大限度地减少必须完成的“步进”次数一个工作芯片。

Silvermont 的每个内核的裸片尺寸预算和功率预算排除了乱序执行和超线程,而乱序执行提供了更好的单线程性能。 这是 Anandtech 的评估

如果我不得不用 Silvermont 来描述英特尔的设计理念,那将是明智的扩展。我们已经从 Apple 的 Swift 以及从 Qualcomm 的 Krait 200 到 Krait 300 的过渡中看到了这一点。请记住最初 Atom 的设计规则:性能每提高 2%,Atom 架构师最多可以将功率提高 1%。换句话说,性能可以提高,但每瓦性能不能下降。Silvermont 坚持这种设计理念,我想我知道如何去做。

以前版本的 Atom 使用超线程来很好地利用执行资源。超线程有与之相关的功率损失,但性能提升足以证明它是合理的。在 22nm 时,英特尔有足够的裸片面积(得益于晶体管缩放)来添加更多内核,而不是依赖 HT 来获得更好的线程性能,因此超线程已被淘汰。英特尔从摆脱超线程中获得的电力节省随后被分配用于使 Silvermont 成为无序设计,这反过来又有助于在没有 HT 的情况下提高执行资源的有效使用。事实证明,在 22nm 时,英特尔用于启用 HT 的芯片面积与 Silvermont 的重新排序缓冲区和 OoO 逻辑大致相同,因此这一举动甚至没有面积损失。

于 2014-04-15T09:23:59.397 回答
6
  1. 并非所有程序员都有足够的知识、时间和许多其他东西来编写高效、缓存友好的程序。大多数时候,只有关键部分在需要时进行优化。其他部分可能有很多缓存未命中

  2. 即使编写程序时考虑到缓存效率,它也可能无法完全消除缓存未命中。缓存可用性是仅在运行时才知道的动态信息,程序员和编译器都不知道优化内存访问。

    • 缓存不可预测性是Itanium 失败的原因之一,因为虽然编译器可以重新排序算术运算,但它无法在多线程环境中猜测这些缓存信息以有效地重新排序内存加载/存储。
    • 每次缓存未命中时,都会浪费数百个周期,这些周期可能对其他目的有用。一些 CPU 执行乱序执行(OoO)。但即使是 OoO 执行也有其局限性,您有时会被阻止。在等待所有内存问题解决的这段时间内,您可以切换到另一个 CPU 线程并继续运行。
  3. 正如 Peter Cordes 所说,还有其他不可避免的停顿,例如分支错误预测或 OoO 无济于事的低指令级并行性。在运行前没有办法解决它们

  4. 现在使用 SMT 的不仅仅是英特尔。AMD Bulldozer具有模块多线程,它是部分 SMT。还有很多其他架构使用 SMT,例如 SPARC、MIPS、PowerPC……甚至还有每核 8 或 16 个线程的 CPU,例如 12 核 96 线程POWER8 CPU或 SPARC T3

    AMD 模块多线程

    https://en.wikipedia.org/wiki/Simultaneous_multithreading#Modern_commercial_implementations

更新:

AMD 现在已在Zen 微架构中转向完整的 SMT

禅SMT

于 2014-04-15T10:02:46.403 回答
4

无论您的代码在机器上编写和运行得多么好,都会有相对较长的 CPU 空闲时间,此时 CPU 只是在等待某事发生。高速缓存未命中是问题的一个子集,等待 I/O、用户输入等都可能导致 CPU 长时间停顿,此时仍可以在第二组寄存器上取得进展。此外,有几个原因导致您无法计划/解决缓存未命中(一个示例是在分支上推送新指令,因为您的可执行文件可能并不完全适合 3 级缓存)。

Silvermont 放弃 HT 的主要原因之一是,在 22 nm 时,您有很多(相对)芯片可供使用。因此,您可以使用更多物理内核来提高并行度。

ARM 和 AMD 尚未实施超线程,因为它是英特尔的专有技术。

于 2014-04-15T09:00:42.763 回答
0

据我所知以及作为高吞吐量计算领域开发人员的经验,SMT/HT 只有一个有用的应用程序,在所有其他应用程序中充其量不会让事情变得更糟:

在虚拟化方面,SMT/HT 有助于降低(线程)上下文切换的成本,从而在使用多个共享相同内核的 VM 时大大降低了延迟。

但是关于吞吐量,我在实践中从未遇到过任何 SMT/HT 实际上并没有让事情变慢的事情。从理论上讲,如果操作系统会优化调度进程,它可能既不会变慢也不会变快,但实际上由于 SMT,它碰巧在同一个内核上调度了两个要求苛刻的进程,从而降低了吞吐量。

因此,在所有用于高性能计算的机器上,我们禁用 HT 和 SMT。在我们所有的测试中,它们将计算速度降低了大约 10-20%。

如果有人有一个真实世界(htoughput 不是延迟)示例,其中 smt/HT 实际上并没有减慢速度,我会很好奇。

于 2021-01-09T12:58:04.603 回答
-1

在使用了带有虚拟化的 8 核 Atoms 之后,我对这种带有 HT 的芯片的前景垂涎三尺。我会同意大多数工作负载可能不是,但对于 ESXi?您对 HT 的使用确实令人印象深刻。低功耗只是为我敲定了交易。如果您可以在 ESXi 上获得 16 个逻辑核心,那么价格/性能将真正达到顶峰。我的意思是,目前的英特尔芯片无法负担 8 核和 HT,并且由于 Vsphere 和 Vsphere 产品按 proc 授权的方式,双 proc 主机对于真正的小型企业来说在成本方面不再有意义。

于 2015-06-19T16:38:25.167 回答