超线程技术是否会影响AVX的性能?

4
在进行超频和运行压力测试时,我注意到启用Hyperthreading时,优化了AVX的LINPACK版本的多线程浮点吞吐量低于禁用Hyperthreading时。这是在Ivy Bridge i7(3770k)上发现的。我还注意到,尽管我将CPU运行在更低的核心电压下,但禁用Hyperthreading后,LINPACK导致更高的核心温度。所有这些都让我相信,在没有Hyperthreading的情况下,流水线利用率实际上更高。
我很好奇:这只是LINPACK算法固有的导致流水线停顿或SMT中低效分配的问题,还是英特尔的SMT实现在两个线程都发出宽SIMD指令时真的很难调度流水线?如果是这样,Haswell解决了这个问题吗,或者未来的英特尔架构会解决这个问题?AVX512是否容易出现这个问题?
最后,在使用AVX进行Intel系统编程时,有哪些好的步骤可以避免SMT中低效的流水线分配?

2
这不是特定于AVX的。对于某些精心调整以不使用超线程的应用程序(例如Linpack),这种情况经常发生。即使在Nehalem时代,Linpack也一直比HT慢。 - Mysticial
@Mystical:有道理。在现实世界中,是否存在任何HT会降低性能的真实任务或用例,还是这种情况不太可能发生? - lcmylin
通常情况下,受到非计算资源(例如内存或输入/输出)严重限制的应用程序是常见的情况。 - Mysticial
3
超线程技术是一种硬件技术,用于在代码未完全优化时提高指令级并行性(例如来自未展开的依赖链和其他种类的停顿)。如果代码已经完全优化,同时多线程超标技术可能会导致性能下降。由于完全优化代码非常困难,在大多数情况下,超线程技术表现良好,但并非总是如此。许多BLAS库都经过高度优化。 - Z boson
1个回答

9

超线程技术将乱序执行资源分享给两个硬件线程,而不是全部分配给一个线程。如果一个线程已经可以保持管道满,则通常最多不会看到加速效果。无论哪种情况,执行单元都应该在每个时钟周期内处理4个需要运行的uops指令。

如果每个线程都在处理自己的内存块,则CPU核心将尝试同时处理更多的活动数据。竞争共享L1 / L2高速缓存可能会导致情况变得比没有超线程还糟。

另外,有些工作负载并行化存在开销。只有像执行多个独立的矩阵乘法这样的embarrassingly-parallel问题(而不是并行化一个大问题)才具有协调线程所需的可忽略的开销。

正如Agner Fog在他的《优化汇编》手册中提到的,如果任何共享或划分的CPU资源都成为瓶颈,那么超线程将毫无益处,甚至可能会有害。当代码花费大量时间于分支预测失败或高速缓存未命中时,超线程表现出极佳的性能,因为另一个线程可以使饥饿的CPU流水线保持运行。

矩阵数学具有足够可预测的访问模式,以使高速缓存未命中和分支预测失败很少发生。尤其是在为缓存大小进行仔细调整的代码中。

如何避免超线程无益处:使您的代码变慢,以便单个线程无法有效地执行它以保持管道满。严肃点说,如果某个算法存在高速缓存未命中或分支预测失败,相比于蛮力方法表现相同,则使用它可能会有所帮助。例如,早期退出测试可能几乎没有优势,考虑到单个线程上分支预测的开销,但当您的代码在同一核心的两个硬件线程上运行时,蛮力方法就处于劣势。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接