c++ - 如何使用 Eigen 和 OpenMP 最大化 CPU 使用率

标签 c++ optimization openmp cpu-usage eigen

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

我正在使用 Ubuntu 14.04。我的代码是用 C++ 编写的。它使用带有OpenMPMKLEigen 矩阵库。我使用带有以下参数的 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 使用率? 谢谢。


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

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 个线程。这正常吗?

最佳答案

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

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

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

因此,Eigen+OpenMP+MKL确实比Eigen+OpenMP高效得多。感谢您的帮助。

关于c++ - 如何使用 Eigen 和 OpenMP 最大化 CPU 使用率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31750450/

相关文章:

c++ - 我应该把空基类放在哪里?

c++ - OpenMP - 在每个循环迭代中启动一个新线程

c - OpenMP 并行前缀和加速

c++ - 先前声明的 G++ 错误,由于 include 中的函数名称重复而导致错误

c++ - 使用浮点/双除法比较可还原分数

c++ - int * array[60] 和 int * array = new int(60); 之间的区别

c++ - 为什么 C 数组在传递给函数时具有错误的 sizeof() 值?

c++ - 如何在运行时从 Windbg 扩展中的 DMP 文件获取类型信息?

c++ - 帮助编译器优化分支代码序列

mysql - MySQL 查询中的重复函数