【问题标题】:Can a hyper-threaded processor core execute two threads at the exact same time?超线程处理器内核可以同时执行两个线程吗?
【发布时间】:2017-11-23 02:38:28
【问题描述】:

我很难理解超线程。如果逻辑核心实际上不存在,那么使用超线程有什么意义? wikipedia 文章指出:

对于物理上存在的每个处理器内核,操作系统会寻址两个虚拟(逻辑)内核并尽可能在它们之间共享工作负载。

如果两个逻辑核心共享同一个执行单元,这意味着一个线程必须在另一个线程执行时被搁置,话虽如此,我不明白超线程如何有用,因为您实际上并没有引入新的执行单元。我无法理解这个

【问题讨论】:

    标签: multithreading multiprocessing cpu-architecture hyperthreading


    【解决方案1】:

    请参阅my answer on a softwareengineering.SE question,了解有关现代 CPU 如何通过一次运行多条指令来查找和利用instruction-level parallelism (ILP) 的一些详细信息。 (包括英特尔 Haswell 流水线的框图,以及更多 CPU 微架构细节的链接)。还有Modern Microprocessors A 90-Minute Guide!

    您有一个带有许多执行单元的 CPU 和一个前端,可以为它们提供大部分工作要做,但只有在良好的条件下。诸如缓存未命中或分支错误预测之类的停顿,或者只是有限的并行性(例如,执行一长串 FP 添加的循环,每 4 或 5 个时钟而不是 1 或 2 个时钟添加一个(标量或 SIMD)的 FP 延迟瓶颈per 每时钟)将导致每个周期的吞吐量远低于 4 条指令,并使执行单元处于空闲状态。

    HT(以及一般的Simultaneous Multithreading (SMT))的目的是让那些饥饿的执行单元有工作要做,即使在运行具有低 ILP 或大量停顿的代码时(缓存未命中 /分支错误预测)。

    SMT 只是为管道添加了一些额外的逻辑,因此它可以同时跟踪两个独立的架构上下文。因此,与拥有两倍或四倍的完整内核相比,它的裸片面积和功耗要少得多。 (Knight's Landing Xeon Phi 每个内核运行 4 个线程,主流 Intel CPU 运行 2 个。一些非 x86 芯片每个内核运行 8 个线程,针对数据库服务器类型的工作负载。)


    常见误解

    超线程只是优化了上下文切换。在缓存未命中时切换到另一个线程的更简单的设计是可能的,但 HT 比这更先进。

    当两个线程处于活动状态时,前端在每个周期(在获取、解码和发布/重命名阶段)在线程之间交替,但 无序内核实际上可以从两个逻辑内核执行 uops在同一个周期

    在通常交替的流水线阶段中,只要一个线程停止,另一个线程就会获得该阶段的所有周期。 HT 比固定交替要好得多,因为一个线程可以完成大量工作,而另一个线程正在从分支错误预测中恢复或等待缓存未命中。

    请注意,一次最多可以有 10 个缓存未命中(来自 Intel CPU 中的 L1D 缓存:这是 LFB(行填充缓冲区)的数量,并且内存请求是流水线的。但是如果下一次加载的地址取决于在较早的加载(例如,指针在树或链表中追逐)时,CPU 不知道从哪里加载,并且不能保持多个请求在飞行中。因此,两个线程都在等待缓存未命中实际上很有用并行。

    当两个线程处于活动状态时,有些资源是静态分区的,有些是竞争共享的。有关详细信息,请参阅this pdf of slides。 (有关如何为 Intel 和 AMD CPU 实际优化 asm 的更多详细信息,请参阅Agner Fog's microarchitecture PDF。)


    当一个逻辑核心“休眠”时(即内核运行HLT 指令或任何MWAIT 以进入更深的休眠状态),物理核心转换为单线程模式并让仍然处于活动状态的逻辑核心拥有所有资源(包括完整的 ReOrder Buffer 大小和其他静态分区资源),因此它在仍在运行的单个线程中查找和利用 ILP 的能力比其他线程简单地因缓存未命中而停止时增加更多。


    顺便说一句,某些工作负载实际上在使用 HT 时运行速度较慢。如果您的工作集几乎不适合 L2 或 L1D 缓存,那么在同一个内核上运行两个将导致更多的缓存未命中。对于已经可以保持执行单元饱和的非常好的高吞吐量代码 (就像高性能计算中的优化矩阵乘法一样),禁用 HT 是有意义的。始终进行基准测试。

    在 Skylake 上,我发现在我的四核 i7-6700k 上,使用 8 个线程而不是 4 个线程,视频编码(x265 -preset slower,1080p)大约快 15%。我实际上并没有为 4 线程测试禁用 HT,但是 Linux 的调度程序擅长在有足够多的情况下不反弹线程并在单独的物理内核上运行线程。考虑到 x265 有很多手写 asm 并且每周期运行非常高的指令,即使它本身有一个完整的内核,15% 的加速也是相当不错的。 (像我使用的较慢的预设往往更受 CPU 限制而不是内存限制。)

    【讨论】:

      猜你喜欢
      • 2015-10-01
      • 1970-01-01
      • 2021-11-02
      • 2014-12-28
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多