首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Eigen + Intel MKL + Pardiso

使用Eigen + Intel MKL + Pardiso
EN

Stack Overflow用户
提问于 2017-06-20 15:30:58
回答 1查看 1.8K关注 0票数 0

我正在尝试使用Eigen对MKL和Pardiso的支持(见下面的示例)。我已经使用英特尔链接线顾问来提供编译器选项,但是我尝试的一切都是不成功的。特别是,以下列方式汇编:

代码语言:javascript
运行
复制
$ 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 *”的参数不兼容:pardiso(pt,&maxfct,&mnum,& type,&期,&n,a,ia,ja,perm,&nrhs,iparm,&msglvl,b,x和error);

在没有64位支持的情况下进行编译时,使用:

代码语言:javascript
运行
复制
$ 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和最新的艾根,3.3.3)

示例(main.cpp)

这个例子用两个Dirichlet边界条件(u_{0} = u_{N+1} = 0)求解泊松方程。

代码语言:javascript
运行
复制
#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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-21 07:08:24

事实证明,eigen3文档对此非常清楚:

通过Eigen使用Intel MKL很容易: ..。

  1. 在64位系统上,必须使用LP64接口(而不是ILP64接口)。

我现在已经成功地编译了

代码语言:javascript
运行
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44657281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档