MKL 不适用于使用 Eigen 和 OpenMP 的 C++ 代码
MKL not working on a C++ code that uses Eigen and OpenMP
我的代码结构如下:
Eigen::MatrixXd function1(args)
{
#pragma omp parallel for
for (args)
//filling a matrix element-wise
return matrix;
}
Eigen::MatrixXd function2(argument is function1 matrix)
{
#pragma omp parallel for
for (args)
//element-wise probabilities calculations on matrix from function1
return matrix;
}
Eigen::MatrixXd global_function(args)
{
Eigen::MatrixXd ident; //identity matrix
for (args)
{
Eigen::MatrixXd mat = function1(args);
Eigen::MatrixXd mat2 = function2(mat);
ident = ident * mat2;
}
return matrix;
}
功能多了,但是方案是一样的。矩阵大小为 500x500 到 1000x1000
该代码使用库:Eigen(构建矩阵)和 Boost(用于函数 2 的一些概率计算),使用 Visual Studio 2013 或 Intel C++ 编译器 15.0 编译(我的情况下两者具有相似的性能)
我正在尝试为矩阵-矩阵乘法实施英特尔 MKL:
因此,在我的代码中实现它之前,我构建了一个简单的项目来使用 Eigen 测试 MKL,它工作正常(矩阵是使用 Eigen 构建的,而矩阵-矩阵乘法使用 MKL,它减少了一半的计算时间)。然后我将 MKL 实现到我的代码中,但是这次没有用,计算时间没有下降,可能是什么原因?
Eigen 可以在后台使用 MKL,因此您可以只对矩阵使用 Eigen 接口,让 Eigen 处理 MKL。
在包含任何 Eigen headers 之前,您所要做的就是 #define EIGEN_USE_MKL_ALL
。
我的代码结构如下:
Eigen::MatrixXd function1(args)
{
#pragma omp parallel for
for (args)
//filling a matrix element-wise
return matrix;
}
Eigen::MatrixXd function2(argument is function1 matrix)
{
#pragma omp parallel for
for (args)
//element-wise probabilities calculations on matrix from function1
return matrix;
}
Eigen::MatrixXd global_function(args)
{
Eigen::MatrixXd ident; //identity matrix
for (args)
{
Eigen::MatrixXd mat = function1(args);
Eigen::MatrixXd mat2 = function2(mat);
ident = ident * mat2;
}
return matrix;
}
功能多了,但是方案是一样的。矩阵大小为 500x500 到 1000x1000 该代码使用库:Eigen(构建矩阵)和 Boost(用于函数 2 的一些概率计算),使用 Visual Studio 2013 或 Intel C++ 编译器 15.0 编译(我的情况下两者具有相似的性能)
我正在尝试为矩阵-矩阵乘法实施英特尔 MKL:
因此,在我的代码中实现它之前,我构建了一个简单的项目来使用 Eigen 测试 MKL,它工作正常(矩阵是使用 Eigen 构建的,而矩阵-矩阵乘法使用 MKL,它减少了一半的计算时间)。然后我将 MKL 实现到我的代码中,但是这次没有用,计算时间没有下降,可能是什么原因?
Eigen 可以在后台使用 MKL,因此您可以只对矩阵使用 Eigen 接口,让 Eigen 处理 MKL。
在包含任何 Eigen headers 之前,您所要做的就是 #define EIGEN_USE_MKL_ALL
。