我有一个 4 核 cpu,我正在尝试优化我的代码以减少我在 2000x2000 Eigen 矩阵乘积上的计算时间。因为我使用的是 OpenMP,所以我预计 CPU 使用率会达到 400%。但是,出于某种原因,我卡在了 200%。
我正在使用 Ubuntu 14.04。我的代码是用 C++
编写的。它使用带有OpenMP
和MKL
的Eigen
矩阵库。我使用带有以下参数的 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/