如何最大限度地利用 Eigen 和 OpenMP cpu

How to maximize cpu usage with Eigen and OpenMP

我有一个 4 核 cpu,我正在尝试优化我的代码以减少我对 2000x2000 本征矩阵乘积的计算时间。由于我使用的是 OpenMP,因此我预计会达到 CPU 使用率的 400%。但是,由于某种原因,我卡在了 200%。

我正在使用 Ubuntu 14.04。我的代码是用C++写的。它使用带有 OpenMPMKLEigen 矩阵库。我用 ICC 编译我的代码,参数如下: (这是我使用 Qt 后的 .pro 文件的摘录)

INCLUDEPATH += /opt/intel/mkl/include
LIBS += -L/opt/intel/mkl/lib/intel64 \
    -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core \
    -L/opt/intel/lib/intel64 \
    -liomp5 -lpthread -lm
DEFINES += NDEBUG
DEFINES += EIGEN_USE_MKL_ALL
QMAKE_CXXFLAGS_RELEASE += -fast -march=corei7 -qopenmp -static

如何才能达到 CPU 使用率的 400%? 谢谢。


PS:编辑 我的代码的哪一部分可能有用?

int nthreads = omp_get_num_threads();
cout << endl << nthreads << " thread(s) available for computation" << endl;
cout << Eigen::nbThreads() << " thread(s) used by Eigen" << endl;

这个,例如显示 1 个可用线程和 Eigen 使用的 4 个线程。这正常吗?

由于您没有提供任何代码片段或其他详细信息,以下是我根据您的问题详细信息得出的意见:-

参考Eigen's help on using MKL routines,必须牢记以下几点:

  • 对于矩阵-矩阵乘法,您的矩阵必须符合某些数据类型。对于任何其他数据类型,正常操作将无视任何 MKL 规范。
  • 如果混合使用复杂数据类型和真实数据类型,则不会进行 MKL 优化。
  • 您必须在包含 Eigen 头文件之前定义 EIGEN_USE_MKL_ALL 宏,才能真正使用 MKL。
  • 你的矩阵是动态的吗?否则,MKL 优化将不会发生。
  • 尽管您指定了 MKL 优化,但它可能不会应用。 Eigen 将检查将值传入和传出 MKL 例程所涉及的开销,如果开销大于没有 MKL 的计算,则不会应用它们。这就是为什么 Eigen 提到 MKL 替换只发生在足够大和密集的对象
  • 最后,如果您的 Eigen 版本低于 3.1,则不会进行 MKL 替换。

您最好检查一下这些规范,如果您确信,请提供代码片段。

此外,它并不总是与 400% CPU 使用率相关。现代编译器执行许多编译器级优化,这些优化因编译器版本而异。所以,我不会死心塌地地直接查看 CPU Usage 作为基准来决定我的程序如何 运行.

top 显示 "only" 200% CPU 使用率(而不是 400%)没有问题。

事实上,我的 CPU 只有 2 个物理核心,但超线程允许它们每个有 2 个逻辑核心(总共 4 个逻辑核心)。这就是为什么当我使用超线程时,top 有时会显示 400% CPU 使用率。

但是Eigen+OpenMP+MKL不使用超线程并进行自己的优化(比常规超线程更好)。 200% CPU 使用率指的是 物理核心 都以 100% 的容量使用,而不是逻辑核心。

因此,Eigen+OpenMP+MKL确实比Eigen+OpenMP更有效率。感谢您的帮助。