如何最大化使用Eigen和OpenMP的cpu使用率

How to maximize cpu usage with Eigen and OpenMP

本文关键字:OpenMP cpu 使用率 Eigen 最大化      更新时间:2023-10-16

我有一个4核cpu,我正试图优化我的代码,以减少我的计算时间对2000x2000特征矩阵的产品。因为我使用的是OpenMP,所以我希望达到400%的CPU使用率。但是,由于某种原因,我停留在200%。

我正在使用Ubuntu 14.04。我的代码是用C++写的。它使用Eigen矩阵库与OpenMPMKL。我用以下参数用ICC编译我的代码:(这是我的。pro文件的提取,因为我使用Qt)

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

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


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;
例如,

this显示1个可用线程和4个被Eigen使用的线程。这正常吗?

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

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

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

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

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

参考Eigen对使用MKL例程的帮助,必须记住以下几点:

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

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

此外,它并不总是与400%的CPU使用率相关。现代编译器执行了许多编译器级别的优化,这些优化在不同的编译器版本之间是不同的。所以,我不会固执地直接把CPU使用率作为基准来决定我的程序是如何运行的。