重复状态资源是否被认为是超线程的最佳选择?

时间:2016-03-02 13:16:31

标签: multithreading performance cpu cpu-registers hyperthreading

This question has an answer说:

  

超线程复制内部资源以减少上下文切换   时间。资源可以是:寄存器,算术单元,缓存。

为什么CPU设计人员最终会使用重复状态资源来实现同步多线程(或英特尔上的超线程)?

为什么不会三倍(四倍,等等)这些相同的资源会为我们提供三个逻辑核心,因此吞吐量更快?

研究人员在某种意义上是否达到重复最佳,还是仅仅反映了当前的可能性(晶体管尺寸等)?

1 个答案:

答案 0 :(得分:1)

你引用的答案听起来不对。超线程竞争性地共享现有的ALU,缓存和物理寄存器文件。

在同一个内核上同时运行两个线程可以让它找到更多的并行性来保持这些执行单元的工作,而不是等待缓存未命中,延迟和分支错误预测。

只需要物理复制或分区一些东西来跟踪一个核心中两个CPU的架构状态,而且它主要位于前端(在发布/重命名阶段之前)。 David Kanter's Haswell writeup显示了Sandybridge如何始终对IDQ(为问题/重命名阶段提供的解码uop队列)进行分区,但IvyBridge和Haswell可以在只有一个线程处于活动状态时将其用作一个大队列。他还描述了如何在线程之间共享缓存。例如,Haswell核心有168 physical integer registers,但每个逻辑CPU的架构状态只需要16个。(每个线程的乱序执行当然会受益于大量寄存器,这就是为什么寄存器重命名为大的物理寄存器文件首先完成。)

现代英特尔CPU拥有如此多的执行单元,您只能通过仔细调整的代码几乎不会使它们饱和,这些代码没有任何停顿并且每个时钟运行4个融合域uop。这在实践中是非常罕见的,除了在手动调整的BLAS库中的矩阵之外。

大多数代码都受益于HT,因为它无法独立地使完整内核饱和,因此单个内核的现有资源可以以比每个速度快一半的速度运行两个线程。 (通常明显快于一半)。

但是当只有一个线程正在运行时,该线程可以使用大核心的全部功能。如果您设计一个具有大量小内核的多核CPU,那么这就是您所失败的。如果英特尔CPU没有实现超线程,那么它们可能不会为单个线程包含相当多的执行单元。它有助于一些单线程工作负载,但对HT有很多帮助。所以你可以说这是一个复制ALU的例子,因为设计支持HT,但它并不重要。

Pentium 4并没有足够的执行资源来运行两个完整的线程而不会损失超过你获得的数量。部分可能是跟踪缓存,但它也没有几乎执行单元的数量。使用HT的P4使得预取线程很有用,除了在What Every Programmer Should Know About Memory中描述/推荐之外(在其他情况下仍然有用和相关)时,从主线程正在循环的数组中预取数据。预取线程具有较小的跟踪缓存占用空间,并且可以读取主线程使用的L1D高速缓存。这是当你没有足够的执行资源来实现HT来实现它时会发生的事情。

对于核心峰值FMA吞吐量存在瓶颈的代码或某些东西(使用10个向量累加器保留10个FMA),HT根本没有帮助。它甚至可能会损害代码,这些代码最终会因为使用另一个线程竞争L1D和L2缓存中的空间而导致的额外缓存未命中而大大减慢。 (还有uop缓存和L1I缓存)。

Agner Fog's microarch pdf说同样的话。

保罗克莱顿对这个问题的评论也对SMT设计提出了一些好的观点。