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" <stevenj....@gmail.com> 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/