在 MKL 库中设置 openmp
Set openmp in MKL Library
我正在尝试编译最小的C++代码
#include <iostream>
#include <mkl.h>
#include <omp.h>
int main(int argc, char *argv[])
{
omp_set_num_threads(4);
return 0;
}
在 MacOSX Sierra 10.12.5 中使用 MKL 库(icc 版本 17.0.4),使用命令
icc main.cpp -o main.o -DMKL_ILP64 -I/opt/intel/compilers_and_libraries_2017.4.181/mac/mkl/include
-L/opt/intel/compilers_and_libraries_2017.4.181/mac/mkl/lib -Wl,-rpath,/opt/intel/compilers_and_libraries_2017.4.181/mac/mkl/lib -lmkl_intel_ilp64
-lmkl_intel_thread -lmkl_core -liomp5 -lpthread -lm -ldl
但是,当我运行程序时收到以下错误
dyld: Library not loaded: @rpath/libiomp5.dylib
Referenced from: /Users/user/C++/MKL1/./main.o
Reason: image not found
/bin/sh: line 1: 8898 Abort trap: 6 ./main.o
make: *** [run] Error 134
如何使用 MKL 库正确设置 openmpi?我试图按照 https://software.intel.com/en-us/articles/dyld-library-not-loadedlibiomp5dylib?page=1#comment-1905809 中的说明进行操作
加入
source /opt/intel/compilers_and_libraries_2017.4.181/mac/mkl/bin/mklvars.sh intel64
但是,我在运行时仍然收到相同的错误。
我已经尝试了几种方法来解决这个问题。这真的花了一整天。但这是结果,
项目文件
我创建了一个非常简单的项目,只有一个文件,名为
test.c
1. 最简单的解决方案
解决此问题可以像以下一样简单:
icc -qopenmp -qopenmp-link=static test.c
此方法仅告诉编译器链接到静态 OpenMP 运行时库。
有趣的是,英特尔C++编译器文档 v.15 的文档说这已被弃用,而英特尔C++编译器文档 v.17 甚至没有提到这个论点,但它有效。可能他们忘了把它拿出来。
2. 另一种方法(我不推荐,英特尔的人也不推荐)
要编译文件,您可以使用普通的"-qopenmp"标志
icc -qopenmp test.c
这将创建"a.out"文件。
这种修复错误的方法利用了调用的命令行实用程序,
install_name_tool
使用这种方法,我们可以更改 @rpath/libiomp5.dylib 的路径
install_name_tool -change @rpath/libiomp5.dylib /opt/intel/compilers_and_libraries_2018.1.126/mac/compiler/lib/libiomp5.dylib a.out
注意:代替compilers_and_libraries_2018.1.126它应该是您的编译器版本。
3. 最佳(正确)方法之一
您可以只添加
export DYLD_LIBRARY_PATH="/opt/intel/compilers_and_libraries_2018.1.126/mac/compiler/lib"
到你的~/.bash_profile
然后使用正常的编译方式,
icc -qopenmp test.c
一切都很完美。
快速提示:您可以使用 otool 命令行实用程序检查文件链接到的库。
otool -L a.out
我在 https://software.intel.com/en-us/forums/intel-fortran-compiler-for-linux-and-mac-os-x/topic/645194 上找到了答案
基本上必须添加 -wl,-rpath,/opt/intel/compilers_and_libraries_2017.4.181/mac/compiler/lib
在编译期间。现在带有 icc 的 openmp 完美运行
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 在C++/Linux中设置单调时钟的一些技巧
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 嵌套在类中时无法设置成员数据
- OpenMP阵列性能较差
- 需要帮助设置在C++中使用的Potrace
- 如何在自删除后将对象设置为nullptr
- 将指针设置为"nullptr"并不能防止双重删除?
- 如何在Ubuntu中使用cmake设置qt4
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- 如何在boost beast http请求中设置http头
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 如何在 OpenMP 中设置线程数
- 在 MKL 库中设置 openmp
- 如何设置参与计算(C 和OpenMP)的CPU核心数
- OpenMP STL设置容器迭代器
- C++ + OpenMP for Parallel Computing:如何在Visual Studio中进行设置
- OpenMp 根据变量设置并行循环的线程数
- 这是openMP的正确用法吗?(或者:我可以信任默认设置吗?)
- 如何从C/ c++控制全局OpenMP设置