After update to MKL 10.2, code chrashes with undefined symbol: mkl_serv_mkl_malloc
Hi,
I recently updated to the Intel Professional 11.1.038 compiler (Linux, Intel 64). I have some code that
ran under 11.0.84 but now crashes.
The error is: /usr/local/matlab77/bin/glnxa64/MATLAB: symbol lookup error:
/opt/intel/Compiler/11.1/038/mkl/lib/em64t/libmkl_vml_mc3.so: undefined symbol: mkl_serv_mkl_malloc
I don't
have any direct VML calls in my code, therefore my assumption at this point is that the error stems from my usage of the
VSL library. (Am I wrong here? Is it possible that the error stems from my usage of BLAS/LAPACK routines?)
My
assumption at this point is that the error is related to the subroutine below (this is the only routine in the project
which uses VSL). This subroutine is called out of a Fortran mex file. I'm not a user with particularly high
technological knowledge, so any comments would be much appreciated.
Thanks in advance!
include
'mkl_vsl.fi' include "errcheck.inc"
subroutine normrandintel(entry,var,n,rands)
USE
MKL_VSL_TYPE USE MKL_VSL
implicit none
real(8), intent(in) :: var integer(8), intent(in)
:: n real(8), dimension(n), intent(out) :: rands integer(4), intent(in) :: entry integer(4) :: gn
integer(4) :: errcode
real(8) :: mu integer :: brng,method,seed
TYPE
(VSL_STREAM_STATE), save :: stream
brng=VSL_BRNG_MT19937 ! this is Mersenne-Twister as in Matlab method=VSL_METHOD_DGAUSSIAN_BOXMULLER ! use Box-Muller transform seed=1758101503
mu=0.0d0
gn=n
!    ***** Initialize ***** if(entry==1) then errcode=vslnewstream( stream, brng,Â
seed ) call CheckVslError(errcode) endif
!    ***** Call RNG ***** errcode=vdrnggaussian( method, stream, gn, rands, mu, var) call CheckVslError(errcode)
if(entry==3)
then !    ***** Deinitialize ***** errcode=vsldeletestream( stream ) call
CheckVslError(errcode) endif
end subroutine normrandintel
| |
Re: After update to MKL 10.2, code chrashes with undefined symbol: mkl_serv_mkl_malloc
Hello, can you please clarify how you build/link your
application? Thanks, Andrey
| |
Re: After update to MKL 10.2, code chrashes with undefined symbol: mkl_serv_mkl_malloc
Hi Jasperjones,Â
Your assumption is right. The libmkl_VML_* library include both VML
and VSL function (no libmkl_VSL * library) . So when you call VSL function, the library was needed. Â
We
introduced the symbol: mkl_serv_mkl_malloc in recent libmkl_VML library in MKL 10.2 version, that may why the
error arise when you upgade to 10.2. But the symbol were defined in libmkl_core library
$ nm
libmkl_core.so | grep mkl_serv_mkl_malloc 0000000000026e76 T mkl_serv_mkl_malloc
And in general,
we always use the mkl libraries together. for example, $  ifort vslTest_main.F90 vslTest.F90
-lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -liomp5Â
Thus, the symbol would be resolved automatically.Â
So could you please check where your application or the matlab link the MKL library and in which way? The key
is to link to mkl_core library at the same time.Â
Best Regards, Ying Â
| |
Re: After update to MKL 10.2, code chrashes with undefined symbol: mkl_serv_mkl_malloc
@Andrey: Please see the following makefile below (I only provide the relevant portion). Needless to say, I source
iccvars.sh (with argument intel64) as required in the documentation, so the declarations of CPATH and MKLROOT should be
obvious.
SHELLÂ Â = /bin/bash MATHOME = /usr/local/matlab77 FCÂ Â Â Â Â =
ifort             FFLAGS = -O3 -xHost -openmp -warn -shared -fexceptions -fPIC
-fno-omit-frame-pointer -DMX_COMPAT_32Â Â Â Â Â Â Â Â Â Â Â Â Â Â INCLÂ Â Â = -I${CPATH}
-I${MATHOME}/extern/include              LIBS   =Â
-L${MKLROOT}/lib/em64t                            ${INCL} -lmkl_intel_lp64
-lmkl_intel_thread -lmkl_core -lguide -lpthread
-lm                                                          Â
             EXT    =
mexa64Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
     Â
                                                           Â
 OBJ   = normrandintel.o # and lots of other stuff here...
mymatlabmexfile.${EXT}: ${OBJ}
${FC} ${FFLAGS} mymatlabmexfile.F90 ${OBJ} -o $@ ${LIBS}Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
normrandintel.o: ${FC} ${FFLAGS} -c normrandintel.F90 ${LIBS}
# lots of other dependencies here...
@Ying: Thanks for your clarifications, this is useful to know. Needless to say, when I do the nm command you
give on my machine the symbol is listed. Please see above for the building/linking.
Finally, note that
I have openmp in the FFLAGS since part of the code uses OpenMP directives. I also tried linking against libiomp5 but
Matlab doesn't seem to like it. (I since reverted back to 11.0.84, I think at some point when using MKL 10.2 I also
experimented with the additional flag to ifort "-openmp-lib legacy" without success.)
| |
Re: After update to MKL 10.2, code chrashes with undefined symbol: mkl_serv_mkl_malloc
Can you please modify LIBs in your makefile as shown below and let us know how it
works?
LIBS = -L${MKLROOT}/lib/em64t ${INCL} -Wl,--start-group -lmkl_intel_lp64 -lmkl_intel_thread
-lmkl_core -Wl,--end-group -openmp -lpthread -lm
Also, the link http://software.intel.com/en-us/articles/intel-mkl-link-line-advisor/ contains Link Line Advisor which is a useful tool to determine MKL link line for your specific
environment.
Thanks, Andrey
| |
Re: After update to MKL 10.2, code chrashes with undefined symbol: mkl_serv_mkl_malloc
Can you please modify LIBs in your
makefile as shown below and let us know how it works?
LIBS = -L${MKLROOT}/lib/em64t ${INCL}
-Wl,--start-group -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -Wl,--end-group -openmp -lpthread -lm
Also,
the link http://software.intel.com/en-us/articles/intel-mkl-link-line-advisor/ contains Link Line Advisor which is a useful tool to determine MKL link line for your specific
environment.
Thanks, Andrey
Andrey, thanks again for offering your help. After making the suggested modification, the mex-file won't run. The
new error message is: OMP: Error #15: Initializing libiomp5.so, but found libguide.so already initialized. OMP: Hint: This may cause performance degradation and correctness issues. Set environment variable
KMP_DUPLICATE_LIB_OK=TRUE to ignore this problem and force the program to continue anyway. Please note that the use of
KMP_DUPLICATE_LIB_OK is unsupported and using it may cause undefined behavior. For more information, please see
http://www.intel.com/software/products/support/. Aborted
(Matlab session aborts.)
| |
Re: After update to MKL 10.2, code chrashes with undefined symbol: mkl_serv_mkl_malloc
Andrey, thanks again for offering your help. After making the suggested modification, the mex-file won't run. The
new error message is: OMP: Error #15: Initializing libiomp5.so, but found libguide.so already initialized. OMP: Hint: This may cause performance degradation and correctness issues. Set environment variable
KMP_DUPLICATE_LIB_OK=TRUE to ignore this problem and force the program to continue anyway. Please note that the use of
KMP_DUPLICATE_LIB_OK is unsupported and using it may cause undefined behavior. For more information, please see
http://www.intel.com/software/products/support/. Aborted
(Matlab session aborts.)
Andrey, while further suggestions from you would most certainly be appreciated, I feel I have to ask my IT department to
take this to Matlab support. It seems Matlab at startup messes with LD_LIBRARY_PATH, so that the output from "ldd
mymexfile.mexa64" from the command line (outside Matlab) is quite different from the output of "!ldd mymexfile.mexa64"
from within Matlab.
From the command line: me@linux:~/workspace/matlab> ldd mymatlabmexfile.mexa64 linux-vdso.so.1 =>Â (0x00007fff627fd000) libmkl_intel_lp64.so =>
/opt/intel/Compiler/11.1/038/mkl/lib/em64t/libmkl_intel_lp64.so (0x00007f2e58aa9000) libmkl_intel_thread.so =>
/opt/intel/Compiler/11.1/038/mkl/lib/em64t/libmkl_intel_thread.so (0x00007f2e57bf8000) libmkl_core.so =>
/opt/intel/Compiler/11.1/038/mkl/lib/em64t/libmkl_core.so (0x00007f2e579cc000) libpthread.so.0 =>
/lib64/libpthread.so.0 (0x00007f2e5778a000) libm.so.6 => /lib64/libm.so.6 (0x00007f2e57533000)
libifport.so.5 => /opt/intel/Compiler/11.1/038/lib/intel64/libifport.so.5 (0x00007f2e573fa000) libifcoremt.so.5
=> /opt/intel/Compiler/11.1/038/lib/intel64/libifcoremt.so.5 (0x00007f2e57157000) libimf.so =>
/opt/intel/Compiler/11.1/038/lib/intel64/libimf.so (0x00007f2e56e04000) libsvml.so =>
/opt/intel/Compiler/11.1/038/lib/intel64/libsvml.so (0x00007f2e56bed000) libiomp5.so =>
/opt/intel/Compiler/11.1/038/lib/intel64/libiomp5.so (0x00007f2e56a59000) libintlc.so.5 =>
/opt/intel/Compiler/11.1/038/lib/intel64/libintlc.so.5 (0x00007f2e5691b000) libc.so.6 => /lib64/libc.so.6
(0x00007f2e565c2000) libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f2e563aa000) libdl.so.2 =>
/lib64/libdl.so.2 (0x00007f2e561a5000) /lib64/ld-linux-x86-64.so.2 (0x00007f2e5a6cd000)
From within
Matlab: >> !ldd mymatlabmexfile.mexa64 linux-vdso.so.1 =>Â (0x00007fff08ffd000)
libmkl_intel_lp64.so => /opt/intel/Compiler/11.1/038/mkl/lib/em64t/libmkl_intel_lp64.so (0x00007f94ff217000)
libmkl_intel_thread.so => /opt/intel/Compiler/11.1/038/mkl/lib/em64t/libmkl_intel_thread.so (0x00007f94fe366000) libmkl_core.so => /opt/intel/Compiler/11.1/038/mkl/lib/em64t/libmkl_core.so (0x00007f94fe13a000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f94fdef8000) libm.so.6 => /lib64/libm.so.6
(0x00007f94fdca1000) libifport.so.5 => /usr/local/matlab77/sys/os/glnxa64/libifport.so.5
(0x00007f94fdb6a000) libifcoremt.so.5 => /opt/intel/Compiler/11.1/038/lib/intel64/libifcoremt.so.5
(0x00007f94fd8c7000) libimf.so => /usr/local/matlab77/sys/os/glnxa64/libimf.so (0x00007f94fd550000)
libsvml.so => /usr/local/matlab77/sys/os/glnxa64/libsvml.so (0x00007f94fd40d000) libiomp5.so =>
/opt/intel/Compiler/11.1/038/lib/intel64/libiomp5.so (0x00007f94fd279000) libintlc.so.5 =>
/opt/intel/Compiler/11.1/038/lib/intel64/libintlc.so.5 (0x00007f94fd13b000) libc.so.6 => /lib64/libc.so.6
(0x00007f94fcde2000) libgcc_s.so.1 => /usr/local/matlab77/sys/os/glnxa64/libgcc_s.so.1 (0x00007f94fccd5000) libdl.so.2 => /lib64/libdl.so.2 (0x00007f94fcad0000) /lib64/ld-linux-x86-64.so.2 (0x00007f9500e3b000)
libirc.so => /usr/local/matlab77/sys/os/glnxa64/libirc.so (0x00007f94fc991000) >>
| |
Re: After update to MKL 10.2, code chrashes with undefined symbol: mkl_serv_mkl_malloc
Hello Jasperjones,Â
It seems you are facing the openmp thread library (libiomp5 and libguide)
 conflict issue as mentioned in <http://software.intel.com/en-us/articles/intel-math-kernel-library-intel-mkl-for-windows-usi
ng-intel-mkl-in-matlab-executable-mex-files/>
This occurs when the threading library used by the mex
file is conflicting with the threading library used by MATLAB. To resolve the problem, link the mex file to the dynamic
threading library, libiomp5 (we recomment use this one since 10.x).
and some of Intel Compiler KB and
Intel IPP KB also talking about these at <http://software.intel.com/en-u
s/articles/opm-abort-initializing-libguide40dll/> http://software.intel.com/en-us/articles/omp-error-15-initia.....ed/ <http://software.intel.com/en-us/articles/omp-error-15-initia.....ed/>
In summary, there are two version threading libraries (libguide and libiomp5) used in your run environment. The libguide may come from Matlab, it seems use MKL 9.x, which use libguide.so by default. And your mex file
may call libiomp5 by default. (-openmp option trigger it).
SO you may either find where Matab use the
libguide.so and update it to libiomp5 or let your mex link back to libgude.so, for example, build your mex
file with LIBS = -L${MKLROOT}/lib/em64t ${INCL} -Wl,--start-group -lmkl_intel_lp64 -lmkl_intel_thread
-lmkl_core -Wl,--end-group -openmp -openmp-lib legacy -lpthread -lm ( You mentioned you have tried this, is there
any error message?).
Best Wishes, Ying
| | |