【问题标题】:Use Eigen + Intel MKL + Pardiso使用 Eigen + Intel MKL + Pardiso
【发布时间】:2017-06-20 15:30:58
【问题描述】:

我正在尝试使用 Eigen 对 MKL 和 Pardiso 的支持(参见下面的示例)。我已经使用Intel link line advisor 提出了编译器选项,但我尝试的一切都不成功。特别是,编译:

$ 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 *”类型的参数不兼容 ::pardiso(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): undefined reference to `pardiso'

我也尝试过使用 OpenMP 进行编译,但同样失败。

我应该如何编译?

(我在 Intel 2016.3.210 和最新的 Eigen 3.3.3 上)

示例(main.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;
}

【问题讨论】:

  • 您使用的是 MKL 版本 >= 10.1 吗?
  • @GavinPortwood 是的,我在 MKL 11.3.3 上(future reference

标签: c++ intel-mkl eigen3


【解决方案1】:

原来eigen3 documentation对此非常清楚:

通过 Eigen 使用英特尔 MKL 非常简单:

...

  1. 在 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-13
    • 2023-02-20
    • 2016-11-26
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 2016-02-12
    • 2013-11-13
    相关资源
    最近更新 更多