Nick
Nick

Reputation: 5430

Linking Intel's MKL (BLAS & LAPACK) to GCC

I am trying to compile a giant software package, and this is the last hurdle I can't seem to figure out.

I'm getting errors like:

RNDiracDeterminantBase.cpp:(.text+0x22bf): undefined reference to `dgetrf_'
RNDiracDeterminantBase.cpp:(.text+0x2524): undefined reference to `dgetri_'
RNDiracDeterminantBase.cpp:(.text+0x3005): undefined reference to `dgetri_'
../../lib/libqmcwfs.a(RNDiracDeterminantBase.cpp.o): In function `qmcplusplus::RNDiracDeterminantBase::ratio(qmcplusplus::ParticleSet&, int, qmcplusplus::ParticleAttrib<qmcplusplus::TinyVector<double, 3u> >&, qmcplusplus::ParticleAttrib<double>&)':
RNDiracDeterminantBase.cpp:(.text+0x4156): undefined reference to `dgemv_'
RNDiracDeterminantBase.cpp:(.text+0x420f): undefined reference to `dger_'

Google reveals that these references are to Intel's MKL library. However, I don't know what file I need to link. I've tried libmkl_core.a, libmkl_gnu_thread.a, libmkl_blacs_intelmpi_lp64.a, etc. There's tons of files in:

/mkl/lib/intel64/

Can post more information if requested.

Upvotes: 3

Views: 19077

Answers (3)

Sandeep S. Sandhu
Sandeep S. Sandhu

Reputation: 427

I had a similar problem when setting up mingw on windows.

The following library linking order worked for me with gcc:

  1. mkl_intel_thread
  2. mkl_rt
  3. mkl_core
  4. mkl_intel_lp64

Hope this helps anyone stuck with this problem.

Upvotes: 4

Intel MKL
Intel MKL

Reputation: 41

Based on the incomplete information you provided, it's likely that you need libmkl_intel_lp64.a, libmkl_gnu_thread.a, and libmkl_core.a.

Intel MKL has a built-in tool to help you figure out linking: /mkl/tools/mkl_link_tool. This tool is also available on the web: http://software.intel.com/en-us/articles/intel-mkl-link-line-advisor. Use this tool to get the exact link line for your situation.

You should have asked your question on the official MKL forum (http://software.intel.com/en-us/forums/intel-math-kernel-library). You'd get the answer for this type of questions within hours instead of days.

Upvotes: 4

Employed Russian
Employed Russian

Reputation: 213586

I don't know what file I need to link. I've tried libmkl_core.a, libmkl_gnu_thread.a, libmkl_blacs_intelmpi_lp64.a, etc. There's tons of files in: /mkl/lib/intel64/

The fact that there are tons of files doesn't mean you have to try each library in turn.

To find out which library defines the symbols you want, run this command:

cd /mkl/lib/intel64
nm -A *.a | egrep '[TWBD] (dger_|dgemv_|dgetrf_|dgetri_)$'

Also be sure to put libraries at the end of your link line, as the order of archive libraries on command line matters.

Upvotes: 10

Related Questions