我有一个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使用。这是正常的吗?
答案 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,必须牢记以下几点:
最好检查这些规格,如果您确信,请提供代码段。
此外,它并不总是与400%的CPU使用率相关联。现代编译器执行许多编译器级别优化,这些优化因编译器版本而异。因此,我不会直接将CPU使用率作为基准来决定我的程序运行方式。