我使用英特尔MKL库和GCC编译器构建相同的应用程序,并提供英特尔建议的所有标志。要使用GCC OMP实现,建议使用-fopenmp,它将程序与-lgomp链接。这在Ubuntu 12.04上工作正常,但在Ubuntu 13.10 GCC似乎无法找到正确的符号。任何人都知道我是否做错了什么?
g ++ -I $ MKLROOT / include -I / home / jjgarcia / mps-bundle-gcc / include -g -O2 -fopenmp -o xy_stuck.exe xy_stuck.cc -O2 -L $ MKLROOT / lib -L / home / jjgarcia / mps-bundle-gcc / lib -lmps -ltensor -lmkl_intel_lp64 -lmkl_core -lmkl_gnu_thread -ldl -lpthread -lf2c
明确添加-lgomp没有帮助,顺便说一句。
这些是错误
/opt/intel/composer_xe_2013.3.163/mkl/lib/intel64/libmkl_gnu_thread.so: undefined reference to `GOMP_critical_end'
/opt/intel/composer_xe_2013.3.163/mkl/lib/intel64/libmkl_gnu_thread.so: undefined reference to `omp_get_thread_num'
/opt/intel/composer_xe_2013.3.163/mkl/lib/intel64/libmkl_gnu_thread.so: undefined reference to `GOMP_sections_end_nowait'
...
使用-v -v获取详细输出会显示GCC调用的链接器。我手动添加了-lgomp,它没有改变。另请注意,链接器不会抱怨没有找到gomp: - ?
/usr/bin/ld --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o xy_stuck.exe /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.8/crtbegin.o -L/opt/intel/composer_xe_2013.3.163/mkl/lib -L/home/jjgarcia/mps-bundle-gcc/lib -L/usr/lib/gcc/x86_64-linux-gnu/4.8 -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/opt/intel/composer_xe_2013.3.163/compiler/lib/intel64 -L/opt/intel/composer_xe_2013.3.163/mkl/lib/intel64 -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../.. -v /tmp/ccm64m9T.o -lmps -ltensor -lmkl_intel_lp64 -lmkl_core -lmkl_gnu_thread -ldl -lpthread -lf2c -lgomp -lstdc++ -lm -lgomp -lgcc_s -lgcc -lpthread -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o