【发布时间】:2015-11-12 14:29:20
【问题描述】:
我正在将一个包含大量系数数组操作的 Matlab 算法移植到 C++,它看起来像这个示例,但通常要复杂得多:
Eigen::Array<double, Dynamic, 1> tx2(12);
tx2 << 1,2,3,4,5,6;
Eigen::Array<double, Dynamic, 1> tx1(12);
tx1 << 7,8,9,10,11,12;
Eigen::Array<double, Dynamic, 1> x = (tx1 + tx2) / 2;
C++ 代码比 Matlab 慢得多(大约 20%)。因此,在下一步中,我尝试打开 Eigen 的英特尔 MKL 实现,这对性能没有任何作用,就像字面上没有任何改进一样。 MKL 是否有可能不改进系数向量运算?有没有办法测试我是否成功链接 MKL? Eigen::vector 类是否有更快的替代方案? 提前致谢!
编辑:我在运行 win7 64 位的 i7-3820 上使用 VS 2013。 更长的例子是:
Array<double, Dynamic, 1> ts = (k2 / (6 * b.pow(3)) + k / b - b / 2) - (k2 / (6 * a.pow(3)) + k / a - a / 2);
Array<double, Dynamic, 1> tp1 = -2 * r2*(b - a)/ (rp.pow(2));
Array<double, Dynamic, 1> tp2 = -2 * r2*rp*log(b / a) / rm2;
Array<double, Dynamic, 1> tp3 = r2*(b.pow(-1) - a.pow (-1)) / 2;
Array<double, Dynamic, 1> tp4 = 16 * r2.pow(2)*(r2.pow(2) + 1)*log((2 * rp*b - rm2) / (2 * rp*a - rm2)) / (rp.pow(3)*rm2);
Array<double, Dynamic, 1> tp5 = 16 * r2.pow(3)*((2 * rp*b - rm2).pow(-1) - (2 * rp*a - rm2).pow(-1)) / rp.pow(3);
Array<double, Dynamic, 1> tp = tp1 + tp2 + tp3 + tp4 + tp5;
Array<double, Dynamic, 1> f = (ts + tp) / (2 * ds*ds);
CMakeLists 的相关部分
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
target_link_libraries(MK ${VTK_LIBRARIES} ${Boost_LIBRARIES} mkl_intel_lp64_dll.lib mkl_intel_thread_dll.lib mkl_core_dll.lib libiomp5md.lib)
到目前为止,我只定义了 EIGEN_USE_MKL_ALL。
【问题讨论】:
-
请提供以下信息:平台;编译器标志;一个稍微长一点的系数向量操作的例子;任何相关定义。
-
另外,你的目标是什么 CPU? (AVX、AVX2.0等)
-
它是 i7-3820,所以支持 AVX,但不支持 AVX2
-
你let Eigen know 它应该使用 MKL。从定义
EIGEN_USE_MKL_ALL开始。 -
什么版本的 MKL?
标签: c++ performance intel-mkl eigen3