如何最大限度地利用 Eigen 和 OpenMP cpu
How to maximize cpu usage with Eigen and OpenMP
我有一个 4 核 cpu,我正在尝试优化我的代码以减少我对 2000x2000 本征矩阵乘积的计算时间。由于我使用的是 OpenMP,因此我预计会达到 CPU 使用率的 400%。但是,由于某种原因,我卡在了 200%。
我正在使用 Ubuntu 14.04。我的代码是用C++
写的。它使用带有 OpenMP
和 MKL
的 Eigen
矩阵库。我用 ICC
编译我的代码,参数如下:
(这是我使用 Qt 后的 .pro 文件的摘录)
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
如何才能达到 CPU 使用率的 400%?
谢谢。
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 个可用线程和 Eigen 使用的 4 个线程。这正常吗?
由于您没有提供任何代码片段或其他详细信息,以下是我根据您的问题详细信息得出的意见:-
参考Eigen's help on using MKL routines,必须牢记以下几点:
- 对于矩阵-矩阵乘法,您的矩阵必须符合某些数据类型。对于任何其他数据类型,正常操作将无视任何 MKL 规范。
- 如果混合使用复杂数据类型和真实数据类型,则不会进行 MKL 优化。
- 您必须在包含 Eigen 头文件之前定义 EIGEN_USE_MKL_ALL 宏,才能真正使用 MKL。
- 你的矩阵是动态的吗?否则,MKL 优化将不会发生。
- 尽管您指定了 MKL 优化,但它可能不会应用。 Eigen 将检查将值传入和传出 MKL 例程所涉及的开销,如果开销大于没有 MKL 的计算,则不会应用它们。这就是为什么 Eigen 提到 MKL 替换只发生在足够大和密集的对象
- 最后,如果您的 Eigen 版本低于 3.1,则不会进行 MKL 替换。
您最好检查一下这些规范,如果您确信,请提供代码片段。
此外,它并不总是与 400% CPU 使用率相关。现代编译器执行许多编译器级优化,这些优化因编译器版本而异。所以,我不会死心塌地地直接查看 CPU Usage 作为基准来决定我的程序如何 运行.
top
显示 "only" 200% CPU 使用率(而不是 400%)没有问题。
事实上,我的 CPU 只有 2 个物理核心,但超线程允许它们每个有 2 个逻辑核心(总共 4 个逻辑核心)。这就是为什么当我使用超线程时,top
有时会显示 400% CPU 使用率。
但是Eigen
+OpenMP
+MKL
不使用超线程并进行自己的优化(比常规超线程更好)。 200% CPU 使用率指的是 物理核心 都以 100% 的容量使用,而不是逻辑核心。
因此,Eigen
+OpenMP
+MKL
确实比Eigen
+OpenMP
更有效率。感谢您的帮助。
我有一个 4 核 cpu,我正在尝试优化我的代码以减少我对 2000x2000 本征矩阵乘积的计算时间。由于我使用的是 OpenMP,因此我预计会达到 CPU 使用率的 400%。但是,由于某种原因,我卡在了 200%。
我正在使用 Ubuntu 14.04。我的代码是用C++
写的。它使用带有 OpenMP
和 MKL
的 Eigen
矩阵库。我用 ICC
编译我的代码,参数如下:
(这是我使用 Qt 后的 .pro 文件的摘录)
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
如何才能达到 CPU 使用率的 400%? 谢谢。
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 个可用线程和 Eigen 使用的 4 个线程。这正常吗?
由于您没有提供任何代码片段或其他详细信息,以下是我根据您的问题详细信息得出的意见:-
参考Eigen's help on using MKL routines,必须牢记以下几点:
- 对于矩阵-矩阵乘法,您的矩阵必须符合某些数据类型。对于任何其他数据类型,正常操作将无视任何 MKL 规范。
- 如果混合使用复杂数据类型和真实数据类型,则不会进行 MKL 优化。
- 您必须在包含 Eigen 头文件之前定义 EIGEN_USE_MKL_ALL 宏,才能真正使用 MKL。
- 你的矩阵是动态的吗?否则,MKL 优化将不会发生。
- 尽管您指定了 MKL 优化,但它可能不会应用。 Eigen 将检查将值传入和传出 MKL 例程所涉及的开销,如果开销大于没有 MKL 的计算,则不会应用它们。这就是为什么 Eigen 提到 MKL 替换只发生在足够大和密集的对象
- 最后,如果您的 Eigen 版本低于 3.1,则不会进行 MKL 替换。
您最好检查一下这些规范,如果您确信,请提供代码片段。
此外,它并不总是与 400% CPU 使用率相关。现代编译器执行许多编译器级优化,这些优化因编译器版本而异。所以,我不会死心塌地地直接查看 CPU Usage 作为基准来决定我的程序如何 运行.
top
显示 "only" 200% CPU 使用率(而不是 400%)没有问题。
事实上,我的 CPU 只有 2 个物理核心,但超线程允许它们每个有 2 个逻辑核心(总共 4 个逻辑核心)。这就是为什么当我使用超线程时,top
有时会显示 400% CPU 使用率。
但是Eigen
+OpenMP
+MKL
不使用超线程并进行自己的优化(比常规超线程更好)。 200% CPU 使用率指的是 物理核心 都以 100% 的容量使用,而不是逻辑核心。
因此,Eigen
+OpenMP
+MKL
确实比Eigen
+OpenMP
更有效率。感谢您的帮助。