启用EIGEN_USE_MKL_ALL后Eigen矩阵乘法触发段错误及DGEMM异常
问题:Eigen结合Intel MKL时矩阵乘法出现段错误与参数错误
我编写了如下简单代码,运行完全正常:
#include <Eigen/Dense> int main() { Eigen::MatrixXd M = Eigen::MatrixXd::Random(1000,1000); M = M.transpose()*M; }
为提升性能,我尝试使用Intel编译器并定义EIGEN_USE_MKL_ALL宏,修改后的代码如下:
#include <Eigen/Dense> #define EIGEN_USE_MKL_ALL int main() { Eigen::MatrixXd M = Eigen::MatrixXd::Random(1000,1000); M = M.transpose()*M; }
此时代码执行M.transpose() * M时触发**Segmentation fault (core dumped)**错误。
之后我改用EIGEN_USE_BLAS宏,又出现新错误:Intel MKL ERROR: Parameter 13 was incorrect on entry to DGEMM.
但如果手动调用dgemm实现矩阵乘法,却没有任何错误:
Eigen::MatrixXd M_transpose = M.transpose(); Eigen::MatrixXd M_result(size, size); cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasTrans, size, size, size, 1.0, M.data(), size, M_transpose.data(), size, 0.0, M_result.data(), size); M = std::move(M_result);
我原本期望仅添加宏定义无需修改代码即可获得性能提升,但简单的矩阵乘法却出现问题,请问这是什么原因?
使用的组件版本信息
- MKL版本:Intel(R) oneAPI Math Kernel Library Version 2022.1-Product Build 20220311 for Intel(R) 64 architecture applications
- Eigen3版本:3.4.0
- icpc (ICC)版本:2021.6.0 20220226
内容的提问来源于stack exchange,提问作者1 1
相关产品推荐
相关产品推荐

