矩阵乘法中的超线程和涡轮增强 - 使用超线程的性能更差

时间:2013-04-19 13:36:44

标签: performance intel matrix-multiplication eigen hyperthreading

我正在调整我的GEMM代码并与Eigen和MKL进行比较。我有一个有四个物理核心的系统。到目前为止,我已经使用了OpenMP的默认线程数(我系统上有8个)。我认为这至少和四个线程一样好。但是,我今天发现,如果我在一个大密集矩阵(1000x1000)上运行Eigen和我自己的GEMM代码,我会使用四个线程而不是八个线程获得更好的性能。效率从45%跃升至65%。我认为这也可以在这个情节中看到 https://plafrim.bordeaux.inria.fr/doku.php?id=people:guenneba

差异非常大。但是,性能稳定性要低得多。使用Eigen和我自己的GEMM代码,每次迭代时性能都会跳跃一点。我很惊讶超线程使性能变得更糟。我想这不是一个问题。这是一个意想不到的观察,我希望能够找到反馈。

我发现这里也建议不使用超线程 How to speed up Eigen library's matrix product?

我确实有关于测量最高性能的问题。我现在做的是运行CPUz并查看频率,因为我正在运行我的GEMM代码,然后在我的代码中使用该数字(我使用的一个超频系统上的4.3 GHz)。我可以信任所有线程的这个数字吗?我怎么知道每个线程的频率来确定最大值?如何正确解释涡轮增压?

3 个答案:

答案 0 :(得分:3)

超线程的目的是提高表现出高延迟的代码的CPU使用率。超线程通过一次处理两个线程来掩盖这种延迟,从而具有更多的指令级并行性。

但是,编写良好的矩阵产品内核具有出色的指令级并行性,因此可以利用近100%的CPU资源。因此没有空间进行第二次超级"线程,其管理的开销只会降低整体性能。

答案 1 :(得分:2)

除非我错过了什么,总是可能的,你的CPU有一个时钟由其所有组件共享,所以如果你测量它的速率为4.3GHz(或者其他)那么那就是它对它有意义的所有组件的速率找出一个比率。想象一下,如果不是这样,那么一些核心以一种速率运行,另一些核心以另一种速率运行;共享组件(例如内存访问)将变得无法管理。

对于超线程实际上会恶化矩阵乘法的性能,我并不感到惊讶。毕竟,超线程是一种穷人的并行化技术,复制指令流水线而不是功能单元。一旦你的代码尖叫着通过FPU推送你的n*10^6连续的内存位置,响应管道停顿的上下文切换就没有多大帮助。在另一个上下文切换消除了有用的时钟周期之前,其他管道最多会尖叫一段时间,最糟糕的是,每个交换机都会严重损坏存储器层次结构中所有精心布置的数据。

超线程不是为了并行数字计算速度而设计的,而是为了提高更一般工作量的性能;我们在高性能计算中使用通用CPU并不是因为我们想要超线程,而是因为所有专业的并行数字CPU已经成为了所有人的方式。

答案 2 :(得分:1)

作为多线程并发服务的提供者,我已经探索了超线程如何影响各种条件下的性能。我发现,使用软件将其自身的高利用率线程限制为可用的实际物理处理器,HT的存在与否几乎没有什么区别。尝试使用比重度计算工作更多的线程的软件可能没有意识到它正在这样做,仅依赖于总处理器数量(在HT下加倍),并且可预测地运行得更慢。启用HT可能提供的最大好处可能是,您可以最大化所有物理处理器,而无需对系统的其余部分进行爬行。如果没有HT,软件通常必须释放一个CPU以保持主机系统正常运行。超线程只是更易切换的线程,它们不是额外的处理器。