我正在调整我的 GEMM 代码并与 Eigen 和 MKL 进行比较。我有一个有四个物理核心的系统。到目前为止,我一直使用 OpenMP 的默认线程数(在我的系统上为八个)。我假设这至少和四个线程一样好。然而,我今天发现,如果我在大型密集矩阵 (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)。我可以相信所有线程的这个数字吗?我如何知道每个线程的频率以确定最大值?如何正确考虑涡轮增压?
最佳答案
超线程的目的是提高表现出高延迟的代码的 CPU 使用率。超线程通过同时处理两个线程从而具有更多的指令级并行性来掩盖这种延迟。
但是,编写良好的矩阵乘积内核表现出出色的指令级并行性,因此可以利用近 100% 的 CPU 资源。因此,没有第二个“ super ”线程的空间,其管理开销只会降低整体性能。
关于performance - 矩阵乘法中的超线程和涡轮增压 - 使用超线程的性能更差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16105956/