如何使用Eigen和OpenMP

时间:2015-07-31 15:59:16

标签: c++ optimization openmp cpu-usage eigen

我有一个4核CPU,我正在尝试优化我的代码,以减少我在2000x2000特征矩阵产品上的计算时间。由于我使用OpenMP,我期望达到400%的CPU使用率。但是,出于某种原因,我被困在200%。

我使用的是Ubuntu 14.04。我的代码是用C++编写的。它使用Eigen矩阵库和OpenMP以及MKL。我用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;

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

2 个答案:

答案 0 :(得分:3)

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

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

Eigen + OpenMP + MKL不使用超线程并进行自己的优化(优于常规超线程)。 200%的CPU使用率是指两个物理核心的使用率均为100%,而不是逻辑核心。

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

答案 1 :(得分:1)

由于您未提供任何代码段或其他详细信息,以下是基于您的问题详细信息的观察结果: -

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

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

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

此外,它并不总是与400%的CPU使用率相关联。现代编译器执行许多编译器级别优化,这些优化因编译器版本而异。因此,我不会直接将CPU使用率作为基准来决定我的程序运行方式。