- Marquer comme nouveau
- Marquer
- S'abonner
- Sourdine
- S'abonner au fil RSS
- Surligner
- Imprimer
- Signaler un contenu inapproprié
Hello,
I'm trying to link MKL with the clang compiler (on Linux), and I'm using the following link-line:
clang-5.0 -std=c++17 -O3 -Wall -Wextra -Wno-missing-braces -Wunreachable-code -stdlib=libstdc++ -fopenmp -msse2 -msse3 -msse4 -D EIGEN_USE_MKL_VML -m64 -O3 -DNDEBUG -lstdc++ -fopenmp -lpthread -Wl,--start-group /path/to/mkl/libmkl_intel_ilp64.a /path/to/mkl/libmkl_gnu_thread.a /path/to/mkl/libmkl_core.a -Wl,--end-group -lgomp -lpthread -ldl [objects] -o [executable] -lm
I get the following errors:
... undefined reference to `MKL_malloc' ... undefined reference to `MKL_free' ... undefined reference to `feastinit' ... undefined reference to `dfeast_sygv'
I followed the instructions from the link advsior for the GCC compiler. This seems as if the library I provided for mkl_core is either somehow not being linked correctly or does not contain the references to "MKL_malloc" (my code has "mkl_malloc" instead, so I'm not sure why it's trying to find this different spelling).
What am I missing? Thanks!
Lien copié
- Marquer comme nouveau
- Marquer
- S'abonner
- Sourdine
- S'abonner au fil RSS
- Surligner
- Imprimer
- Signaler un contenu inapproprié
Here's the log output when I run that previous command with the -v (verbose) flag:
"/usr/bin/ld" -z relro --hash-style=gnu --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o [executable] /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../x86_64-linux-gnu/crt1.o /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../x86_64-linux-gnu/crti.o /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/crtbegin.o -L/path/to/intel64 -L/usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0 -L/usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../x86_64-linux-gnu -L/lib/x86_64-linux-gnu -L/lib/../lib64 -L/usr/lib/x86_64-linux-gnu -L/usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../.. -L/usr/lib/llvm-5.0/bin/../lib -L/lib -L/usr/lib -l:libmkl_core.a -l:libmkl_intel_ilp64.a -l:libmkl_gnu_thread.a -lgomp -lpthread -lm -ldl [objects] -lm -lstdc++ -lomp -lgcc --as-needed -lgcc_s --no-as-needed -lpthread -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/crtend.o /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../x86_64-linux-gnu/crtn.o
- Marquer comme nouveau
- Marquer
- S'abonner
- Sourdine
- S'abonner au fil RSS
- Surligner
- Imprimer
- Signaler un contenu inapproprié
pls try to add -DMKL_ILP64 option in the case if you need to link with ILP64 API
- Marquer comme nouveau
- Marquer
- S'abonner
- Sourdine
- S'abonner au fil RSS
- Surligner
- Imprimer
- Signaler un contenu inapproprié
I added that option, but I still get the same error :( thanks for catching that though.
- Marquer comme nouveau
- Marquer
- S'abonner
- Sourdine
- S'abonner au fil RSS
- Surligner
- Imprimer
- Signaler un contenu inapproprié
My first guess is that since ld is a one pass linker, you need to put the mkl libraries at the end of the link line. Your libraries will be passed first, and tell the linker which symbols it needs to be resolved. Then the linker will pass the intel libraries and pick out the symbols it needs.
If you put your objects in the start-group and the end-group, then the linker will make multiple passes in trying to satisfy the symbols. The reason MKL has this is due to possible circular dependencies between the static libraries. This would fail in a one pass linker, unless the libraries were placed multiple times on the same link line. For example:
libA.a libB.a libA.a
would be required to fix the circular dependency without the start-group and end-group options.
- Marquer comme nouveau
- Marquer
- S'abonner
- Sourdine
- S'abonner au fil RSS
- Surligner
- Imprimer
- Signaler un contenu inapproprié
I gave your suggestion a try, by duplicating the libmkl_core.a (as well as the others), but that doesn't work. Is there a recommended linker for MKL?
- Marquer comme nouveau
- Marquer
- S'abonner
- Sourdine
- S'abonner au fil RSS
- Surligner
- Imprimer
- Signaler un contenu inapproprié
The linker is usually part of the system, unless clang has its own. I am seeing the symbols here:
nm libmkl_intel_ilp64.so | grep -i malloc
00000000001b2ff0 T cblas_xerbla_malloc_error
000000000063c1d0 T fftwf_malloc
00000000006383e0 T fftw_malloc
000000000013d3e0 T mkl_malloc
000000000013d3e0 T mkl_malloc_
000000000013d3f0 T MKL_malloc
000000000013d3e0 T MKL_MALLOC
000000000013d400 T mkl_serv_iface_malloc
U mkl_serv_malloc
Of course you are using the .a file instead of the .so.
- S'abonner au fil RSS
- Marquer le sujet comme nouveau
- Marquer le sujet comme lu
- Placer ce Sujet en tête de liste pour l'utilisateur actuel
- Marquer
- S'abonner
- Page imprimable