在 2016年11月16日星期三 UTC+8上午12:49:13,Ángel de Vicente写道: > > Hi, > > I wanted to try this out. My test Fortran module is the following, which > I compile with: ifort -mkl -o test_mod.so test_mod.f90 -shared -fpic > ,---- > | module testmodule > | > | implicit none > | > | double precision, external :: ddot > | double precision, dimension(3) :: d,e > | > | integer :: i > | > | contains > | > | function dot_f() > | double precision :: dot_f > | > | do i = 1,3 > | d(i) = 1.0d0*i > | e(i) = 3.5d0*i > | end do > | > | dot_f = ddot(3,d,1,e,1) > | end function dot_f > | > | END module testmodule > `---- > > and my test.jl > ,---- > | ccall((:testmodule_mp_dot_f_, "./test_mod"),Float64, ()) > `---- > > If I try to run test.jl I get, as per the OP: > ,---- > | julia> include("test.jl") > > > | Intel MKL FATAL ERROR: Cannot load libmkl_avx.so or libmkl_def.so. > `---- > > > "Steven G. Johnson" <steve...@gmail.com <javascript:>> writes: > > I got > > Intel MKL FATAL ERROR: Cannot load libmkl_avx2.so or libmkl_def.so. > > > > Possibly you need to add the directory containing these files > > (/opt/intel/composer_xe_2015.0.090/mkl/lib or similar?) to your > LD_LIBRARY_PATH > > environment variable, so that the runtime linker knows where to find > them. > > In this case this is not enough. > > If you try to open the library directly you get: > ,---- > | julia> > Libdl.dlopen("/opt/intel/2016.0.1/compilers_and_libraries_2016.1.150/linux/mkl/lib/intel64/libmkl_avx2.so") > > > | ERROR: could not load library > | > "/opt/intel/2016.0.1/compilers_and_libraries_2016.1.150/linux/mkl/lib/intel64/libmkl_avx2.so" > > > | > /opt/intel/2016.0.1/compilers_and_libraries_2016.1.150/linux/mkl/lib/intel64/libmkl_avx2.so: > > > | undefined symbol: mkl_dft_fft_fix_twiddle_table_32f > > | in dlopen(::String, ::UInt32) at ./libdl.jl:90 (repeats 2 times) > `---- > > and nm confirms that those symbols are undefined: > ,---- > | [angelv@duna intel64]$ nm libmkl_avx2.so | grep fft_fix > | U mkl_dft_fft_fix_twiddle_table_32f > | U mkl_dft_fft_fix_twiddle_table_64f > `---- > > and they are acutally defined in libmkl_core.so > ,---- > | [angelv@duna intel64]$ nm libmkl_core.so | grep fft_fix > | 00000000018e3020 D mkl_dft_fft_fix_twiddle_table_32f > | 00000000018e2800 D mkl_dft_fft_fix_twiddle_table_64f > | [angelv@duna intel64]$ > `---- > > > So, a workaround is to open libmkl_core.so first with the flag > RTLD_GLOBAL and then run the test.jl code: > > ,---- > | julia> > | > Libdl.dlopen("/opt/intel/2016.0.1/compilers_and_libraries_2016.1.150/linux/mkl/lib/intel64/libmkl_core.so",Libdl.RTLD_GLOBAL) > > > | Ptr{Void} @0x0000000003af6fa0 > > > | > > > | julia> include("test.jl") > > > | 49.0 > `---- > > But, to be honest, I don't fully understand if this will be enough for > all codes using MKL or perhaps other dependencies are there which forces > you to open more libraries manually with RTLD_GLOBAL. But at least it > points in the right direction. > > Cheers, > -- > Ángel de Vicente > http://www.iac.es/galeria/angelv/ >
You have solved the problem, that's nice. But maybe I should reconsider whether to use mkl in such a uncomfortable way.