【发布时间】:2022-08-03 18:08:32
【问题描述】:
我有一个使用 openMP 和 MKL 的 Fortran MPI 程序。在我的个人计算机上,我会通过调用mpiifort Program.F90 -i8 -qmkl -fopenmp -o run 之类的东西来使用英特尔编译器进行编译,然后以mpirun ./run 的身份运行程序。
我想在集群上运行这个程序,在那里我可以访问英特尔 MPI 但没有其他库。因此我需要静态链接 MKL。从 Intel MKL Link Line Advisor 我获得以下信息,
-Wl,--start-group ${MKLROOT}/lib/intel64/libmkl_intel_ilp64.a ${MKLROOT}/lib/intel64/libmkl_intel_thread.a ${MKLROOT}/lib/intel64/libmkl_core.a -Wl,--end-group -liomp5 -lpthread -lm -ldl
这条线的设置使得 MKL 将与我的代码所需的 openMP 并行化。但是,如果我尝试在集群上运行此代码,则会收到错误消息:error while loading shared libraries: libiomp5.so: cannot open shared object file: No such file or directory。似乎我链接并行化 MKL 的尝试并不是完全静态的,因为它仍然尝试动态链接。有什么方法可以规避这个问题,即以完全静态的方式链接 MKL 的 openMP 线程版本?
谢谢!
-
您的链接行有
-liomp5。拼写出来:使用明确的.a版本。 -
谢谢!这似乎已经解决了
-
不过要非常小心。将多个 OpenMP 运行时链接到同一代码可能会导致性能下降,因为每个都使用自己的线程池...(您正在做的事情可能还可以,因为您仍然只有一个 OpenMNP 运行时,而可能不会在构建时将 OpenMP 静态链接到每个静态库!)
标签: linker fortran openmp intel-mkl