Visual c++ 两个不同版本的OpenMP能否在同一个可执行文件中共存?

Visual c++ 两个不同版本的OpenMP能否在同一个可执行文件中共存?,visual-c++,version,openmp,intel-mkl,Visual C++,Version,Openmp,Intel Mkl,我必须使用微软Visual C++ 2013来构建一个项目,它使用OpenMP和链接到英特尔MKL库,该库也使用OpenMP。问题是Visual C++ 2013使用OpenMP 2,而MKL是用OpenMP 4构建的。p> 一切似乎都很好,即使这可能是一个错误的印象 我收到一些警告: warning C4005: 'HUGE_VALF' : macro redefinition 我不能只是禁用这些警告。我怎样才能修好它们 如答案所示,我必须排除Microsoft自己的OpenMP实现,而只

我必须使用微软Visual C++ 2013来构建一个项目,它使用OpenMP和链接到英特尔MKL库,该库也使用OpenMP。问题是Visual C++ 2013使用OpenMP 2,而MKL是用OpenMP 4构建的。p> 一切似乎都很好,即使这可能是一个错误的印象

我收到一些警告:

warning C4005: 'HUGE_VALF' : macro redefinition
我不能只是禁用这些警告。我怎样才能修好它们


如答案所示,我必须排除Microsoft自己的OpenMP实现,而只使用Intel的OpenMP实现。因此,我将其添加到我的CMakeLists.txt文件中:

# Disable Microsoft's default OpenMP v.2 inclusion
set_target_properties(${PROJECT_LIB} PROPERTIES LINK_FLAGS /nodefaultlib:vcomp)
set_target_properties(${PROJECT_LIB} PROPERTIES LINK_FLAGS /nodefaultlib:vcompd)
set_target_properties(${PROJECT_LIB} PROPERTIES LINK_FLAGS libiomp5md.lib)

但是我仍然收到同样的警告…

我不确定这是否有帮助,但我过去已经遇到过这样的问题。下面的文章()提出了一些解决方法

我不确定这是否有帮助,但我过去已经遇到过这样的问题。下面的文章()提出了一些解决方法

您需要非常小心,确保只有一个OpenMP运行库链接到您的代码中。若你们不这样做,你们几乎肯定会得到两倍于你们应有的线程数,从而导致硬件订阅过多和性能低下


Intel意识到了这个问题,因此Intel openMP运行时库(“libiomp5”)提供了由Microsoft编译器编译的代码所需的运行时接口。因此,您可以链接到英特尔运行时,一切都应该很好

您需要非常小心,确保只有一个OpenMP运行库链接到您的代码中。若你们不这样做,你们几乎肯定会得到两倍于你们应有的线程数,从而导致硬件订阅过多和性能低下


Intel意识到了这个问题,因此Intel openMP运行时库(“libiomp5”)提供了由Microsoft编译器编译的代码所需的运行时接口。因此,您可以链接到英特尔运行时,一切都应该很好

按照Jim Cownie的回答,要从项目中排除旧的Microsoft OpenMP并使用Intel的OpenMP,以下是语法:

cl /MD /openmp hello.cpp /link /nodefaultlib:vcomp /nodefaultlib:vcompd libiomp5md.lib
它不包括MSVC OpenMP(vcomp.lib vcompd.lib)并连接英特尔OpenMP(TR4版:5.0版)(libiomp5md.lib)


参考:

根据Jim Cownie的回答,要从项目中排除旧的Microsoft OpenMP并使用Intel的OpenMP,以下是语法:

cl /MD /openmp hello.cpp /link /nodefaultlib:vcomp /nodefaultlib:vcompd libiomp5md.lib
它不包括MSVC OpenMP(vcomp.lib vcompd.lib)并连接英特尔OpenMP(TR4版:5.0版)(libiomp5md.lib)


参考资料:

是的,很遗憾,这是可能的。您通常可以通过将环境变量OMP_DISPLAY_ENV设置为TRUE来检测到这一点。如果有两个运行时,您应该看到报告的信息两次。是的,很遗憾,这是可能的。您通常可以通过将环境变量OMP_DISPLAY_ENV设置为TRUE来检测到这一点。如果有两个运行时,您应该看到报告的信息两次。