gpt4 book ai didi

c++ - 具有 mkl 后端的特征库的系数数组操作的性能

转载 作者:太空狗 更新时间:2023-10-29 23:50:19 26 4
gpt4 key购买 nike

我正在将具有大量系数数组操作的 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 是否有可能不改进系数 vector 运算?有没有办法测试我是否成功链接 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。

最佳答案

替换对 pow(2)pow(3) 的调用,以及对 square()cube( )。与 pow(-1) 相同,最好用除法代替。我希望 MatLab 能够为您完成所有这些类型的优化,但在 C++ 中,只有在编译器级别工作才能使此类编译时优化成为可能。

关于c++ - 具有 mkl 后端的特征库的系数数组操作的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32092971/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com