- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
On Linux with GCC, how can I ensure that I am linking against blas and lapack in Intel MKL kit, which is supposed to have better performance than standard Linux system blas and lapack?
I thought if I compile my application with '-lmkl_blas95_lp64 -lmkl_lapack95_lp64', it will link against blas and lapack in Intel MKL kit.
But if I use 'ldd compiled_binary' it shows the binary is linked against standard Linux system blas and lapack
libblas.so.3 => /usr/lib64/libblas.so.3 (0x00007f51fa44d000)
libf77blas.so.3 => /usr/lib64/atlas/libf77blas.so.3 (0x00007f51fa229000)
libcblas.so.3 => /usr/lib64/atlas/libcblas.so.3 (0x00007f51fa008000)
liblapack.so.3 => /usr/lib64/atlas/liblapack.so.3 (0x00007ff407c2f000)
What am I doing wrong here? Thanks.
- Tags:
- MKL BLAS LAPACK
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
If your code does not make any Lapack95 or BLAS95 calls, but calls the Fortran 77 routines in Lapack and BLAS, the two extra libraries that you specified do not contain any routines that are needed, so the linker will pull nothing from them. The routines in the *95 libraries have shorter argument lists and often some of the arguments are optional, so any routine that calls these more convenient interfaces needs to provide interfaces to them. See the examples provided with MKL.
If you are calling Lapack or BLAS routines from C code, you should not be using the *95 libraries at all -- they are only for calling from modern Fortran.
If you want to use the MKL versions of the Lapack and BLAS libraries, you will have to use the linker's -L option to specify the location of those libraries, and -l options to specify which MKL libraries to use.
It is helpful to use the MKL Link Line Advisor for obtaining the command line to use.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Then what -L -l option I should use to force my app to use BLAS and LAPACK from MKL? I thought '-lmkl_blas95_lp64 -lmkl_lapack95_lp64' was for BLAS and LAPACK.
ls *blas* *lapack* in lib/ gives me:
libmkl_blas95_ilp64.a libmkl_scalapack_ilp64.so
libmkl_blas95_lp64.a libmkl_scalapack_ilp64.so.1
libmkl_lapack95_ilp64.a libmkl_scalapack_lp64.a
libmkl_lapack95_lp64.a libmkl_scalapack_lp64.so
libmkl_scalapack_ilp64.a libmkl_scalapack_lp64.so.1
Thanks.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I followed MKL Link Line Advisor and used
-L${MKLROOT}/lib/intel64 -Wl,--no-as-needed -lmkl_intel_ilp64 -lmkl_gnu_thread -lmkl_core -lgomp -lpthread -lm -ldl
This is the just what I used before trying '-lmkl_blas95_lp64 -lmkl_lapack95_lp64'
ldd shows my app still use blas from system lib /usr/lib64/libblas.so.3
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
You have not told us which BLAS and Lapack routines are being called from your code and you have not reported how you compile and link, and I cannot guess what is going wrong.
To repeat what I wrote earlier: You should not be trying to link with libraries containing "95" in their names at all unless you are coding in Fortran and you chose deliberately to call Lapack95/BLAS95 routines.
You should not link libraries and objects with a mix of LP64/ILP64 conventions, with rare exceptions. LP64 is for calling MKL routines with 32-bit integer arguments, and ILP64 is for 64-bit integer arguments.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I do not know which BLAS and Lapack routines are being called. I am using a 3rd party lib IpOpt https://coin-or.github.io/Ipopt/INSTALL.html which says:
-L${MKLROOT}/lib/intel64 -Wl,--no-as-needed -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lm
I suppose IpOpt is using standard BLAS and Lapack routines. So the above should cause the compiled IpOpt to use BLAS and Lapack routines from MKL. But 'ldd' says it's using BLAS and Lapack routines from system '/lib64'.
I am not mixing ilp64 and lp64, I am just trying both (ilp64 always or lp64 always).
Thanks.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Are you saying that for standard blas and lapack routines,
-L${MKLROOT}/lib/intel64 -Wl,--no-as-needed -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lm
will link against blas and lapack routines in MKL?
Thanks.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I finally found the cause. CoinIpOpt use another 3rd party lib, which has to be compiled with
-L${MKLROOT}/lib/intel64 -Wl,--no-as-needed -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lm
as well. Otherwise it is using system blas lib in /lib64.
Thanks.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Jim,
Glad you have found the cause.
As your issue is resolved now, let us know if we can close the thread.
Regards
Prasanth
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Jim,
As your issue has been resolved, we are closing this thread. If you require additional assistance from Intel, please start a new thread. Any further interaction in this thread will be considered community only
Regards
Prasanth

- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page