Use Eigen + Intel MKL + Pardiso
Use Eigen + Intel MKL + Pardiso
我正在尝试使用Eigen对MKL和Pardiso的支持(见下面的示例)。我已经使用英特尔链接线顾问来提供编译器选项,但我正在尝试的所有方法都没有成功。特别是编译:
$ icpc -I${HOME}/src/eigen -DEIGEN_USE_MKL_ALL -DMKL_ILP64 -I${MKLROOT}/include main.cpp -L${MKLROOT}/lib/intel64 -lmkl_intel_ilp64 -lmkl_sequential -lmkl_core -lpthread -lm -ldl
导致以下类型错误:
~/src/eigen/Eigen/src/PardisoSupport/PardisoSupport.h(50):错误:"int *"类型的参数与类型为"const long long *"的参数不兼容 ::p ardiso(pt, &maxfct, &mnum, &type, &phase, &n, a, ia, ja, perm, &nrhs, iparm, &msglvl, b, x, &error);
在没有 64 位支持的情况下进行编译时,请使用:
$ icpc -I${HOME}/src/eigen -DEIGEN_USE_MKL_ALL -I${MKLROOT}/include main.cpp -L${MKLROOT}/lib/intel64 -lmkl_sequential -lmkl_core -lpthread -lm -ldl
结果:
main.cpp:(.text+0x759):对"pardiso"的未定义引用
我也尝试过用OpenMP编译,同样没有成功。
我应该如何编译?
(我在英特尔 2016.3.210 和最新的 Eigen,3.3.3 上)
示例(主要.cpp)
这个例子求解泊松方程,有两个狄利克雷边界条件 (u_{0} = u_{N+1} = 0)
#include <iostream>
#include <iomanip>
#include <math.h>
#include <Eigen/Dense>
#include <Eigen/PardisoSupport>
int main()
{
typedef Eigen::SparseMatrix<double> SpMat;
typedef Eigen::Triplet <double> Trip;
typedef Eigen::PardisoLU <SpMat > Solver;
size_t N = 11;
SpMat A(N,N);
Eigen::VectorXd f(N);
f *= 0.0;
f((N-1)/2) = 1.0;
std::vector<Trip> Atr;
Atr.push_back(Trip(0,0,+2.0));
Atr.push_back(Trip(0,1,-1.0));
for ( size_t i=1; i<N-1; ++i ) {
Atr.push_back(Trip(i,i-1,-1.0));
Atr.push_back(Trip(i,i ,+2.0));
Atr.push_back(Trip(i,i+1,-1.0));
}
Atr.push_back(Trip(N-1,N-2,-1.0));
Atr.push_back(Trip(N-1,N-1,+2.0));
A.setFromTriplets(Atr.begin(),Atr.end());
Solver solver;
solver.analyzePattern(A);
solver.factorize(A);
Eigen::VectorXd u = solver.solve(f);
return 0;
}
事实证明,eigen3 文档对此非常清楚:
通过特征码使用英特尔 MKL 非常简单:
。
- 在 64 位系统上,您必须使用 LP64 接口(而不是 ILP64 接口)
我现在已经成功编译了
icpc -I${HOME}/src/eigen -DEIGEN_USE_MKL_ALL -DMKL_LP64 -I${MKLROOT}/include main.cpp -L${MKLROOT}/lib/intel64 -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lpthread -lm -ldl
相关文章:
- 将gsl c++程序与"英特尔MKL"链接
- 如何指示 CMAKE 在 Visual Studio 中使用英特尔 MKL
- 在本征C++中 MKL 的函数"zgges"等价物是多少?
- 检测 Visual Studio 项目的属性中是否启用了英特尔 MKL
- 如何使用Cmake在Linux上设置MKL
- 无法运行使用 MKL 编译的 TensorFlow
- 特征运算符如何在内部解释为 MKL 函数?
- 使用特征/英特尔 MKL 求解稀疏线性系统
- Cython通过vdMul调用MKL在元素乘法上崩溃
- Use Eigen + Intel MKL + Pardiso
- 在 MKL 库中设置 openmp
- 使用 MKL 稀疏矩阵向量乘法
- 使用 MKL 编译 Eigen3
- 英特尔 MKL 稀疏 QR 求解 C++ 返回未初始化错误
- cblas_layout在MKL.H的GCC版本中未声明
- MKL矩形矩阵Inplace转置:不使用多个核心
- 在 Linux 上实施英特尔 MKL 的 DFT 时"Segmentation fault"
- 使用MKL并行SPMV随着螺纹编号的增加而减慢
- 构建不依赖于MSVCR120.DLL的自定义英特尔 MKL DLL
- Compile Eigen + Intel MKL with CMake