MKL/Lapack compilation problem

MKL/Lapack compilation problem

scousemouse的头像

Sorry if this is a really simple question but I'm pulling my hair out with this one! I've just installed the MKL and wrote a couple of test programs. The first one just uses BLAS and compiles and runs fine with:

ifc -o test_blas -L/opt/intel/mkl/lib/32/ -lmkl_p3 -lguide test_blas.f90

However, a similar program using a lapack routine doesn' compile and:

ifc -o test_lapack -L/opt/intel/mkl/lib/32/ -lmkl_lapack -lmkl_p3 -lguide test_lapack.f90

returns an error:

undefined reference to 'sgesv_'

What is going on quite? When I 'ar t libmkl_lapack.a | grep sgesv' I get

sgesv.o
.....
_sgesv.o
.....

Have I missed something really obvious? I don't see how the BLAS can work fine and this cause problems. Any pointers would be much appreciated.

Thanks

8 帖子 / 0 new
最新文章
如需更全面地了解编译器优化,请参阅优化注意事项
Martyn Corden (Intel)的头像

Yes, seems odd. Where does the reference come from? Perhaps try linking with the mkl shared libraries?

scousemouse的头像

OK, please excuse my ignorance but how do I link with the shared libraries as opposed to the static?

The reference comes from my program which is calling sgesv as a test.

Well, now if I compile with:

ifc -o test_lapack -L/opt/intel/mkl/lib/32/ -lmkl_lapack32 -lmkl_p3 -lguide test_lapack.f90

I can compile fine. When it comes to running the executable I get:

error while loading shared libraries: libmkl_lapack.so: cannot open shared object file: No such file or directory

Which is strange because I've quoted -lmkl_lapack32 and libmkl_lapack32.so exists! Also, my LD_LIBRARY_PATH is set correctly.

Thanks for any further pointers.

mr-todd的头像

I'm not sure if this is a bug or a feature:

You have linked test_lapack with -lmkl_lapack32 but a
'ldd test_lapack' searches for 'libmkl_lapack.so'.

A quick and dirty solution, link libmkl_lapack32.so to libmkl_lapack.so and it works.

Cheers, mr-todd.

scousemouse的头像

Thanks a bunch! Quick and dirty and it does work.

Now, to help with future problems, could you explain _why_ it works?!

Tim Prince的头像

When you say that your LD_LIBRARY_PATH is set correctly, do you mean that the MKL library path is included? I don't have the latest version of MKL, but mine doesn't set this up automatically. When I have set up the compiler environment variables, the compiler library path is added to LD_LIBRARY_PATH, but the MKL library path is still not included. If you are implying that these things should be set up automatically, I agree, but apparently that is not the case. It is a traditional problem with g77 as well; the libraries aren't necessarily picked up from the same software installation you used to build.

I believe that only the older versions of MKL support static linking. If you have a preferred solution, such as having the mkl libraries become sym-linked automatically into the ifc library path, or the standard paths according to LSB, you might consider filing a report on premier.intel.com. Give your version details and the explanation of how your executable can't find the .so, without your taking additional steps beyond the basic installation.

scousemouse的头像

Yes, I set LD_LIBRARY_PATH explicitly in my shell .bashrc script - echo $LD_LIBRARY_PATH gives:

/opt/intel/compiler70/ia32/lib:/opt/intel/mkl/lib/32

My IFC is version 7.0 and MKL version 5.2.

Is this not an issue with the way I am calling the compiler/or exactly which libraries I am using given that I can compile and link and run sucessfully with the MKL BLAS library, with exactly the same compiler options/environment (apart from obviously the specified libraries)?

Feeling very confused!

scousemouse的头像

OK, phrasing this another way, I've posted the 2 code snippets at:

http://eiger.jaeggi.co.uk/fortran/

I can compile and run test_blas.f90 fine. Please can someone let me know what command line options I need to use to get test_lapack.f90 to compile and run.

Thanks!

登陆并发表评论。