Могут ли две разные версии OpenMP сосуществовать в одном и том же исполняемом файле? - PullRequest
0 голосов
/ 25 марта 2020

Я должен использовать Microsoft Visual C ++ 2013 для создания проекта, который использует OpenMP и ссылки на библиотеку Intel MKL, которая также использует OpenMP. Проблема в том, что Visual C ++ 2013 использует OpenMP 2.0, а MKL построен на OpenMP 4.x.

Кажется, все работает нормально, даже если это может быть ложным впечатлением.

Я получаю некоторые из этих предупреждений:

warning C4005: 'HUGE_VALF' : macro redefinition

Я не могу просто отключить эти предупреждения. Как я могу их исправить?


Как указано в ответах, я должен исключить собственную реализацию Microsoft OpenMP и использовать только Intel. Поэтому я добавил это в свой файл 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)

Однако я все еще получаю те же предупреждения ...

Ответы [ 3 ]

1 голос
/ 26 марта 2020

Вы должны быть очень осторожны и убедиться, что в вашем коде есть только одна библиотека времени выполнения OpenMP. Если вы этого не сделаете, вы почти наверняка получите в два раза больше потоков, чем следовало бы, и, как следствие, чрезмерную подписку на оборудование и низкую производительность.

Intel распознала эту проблему, поэтому библиотека времени выполнения Intel openMP («libiomp5») предоставляет интерфейсы времени выполнения, необходимые для кода, скомпилированного компилятором Microsoft. Поэтому вы можете ссылаться на время выполнения Intel, и все должно быть хорошо.

1 голос
/ 26 марта 2020

Я не уверен, поможет ли это, но я уже встречался с такой проблемой в прошлом. В следующей статье (https://software.intel.com/en-us/articles/limits1120-error-identifier-builtin-nanf-is-undefined) предложены некоторые обходные пути.

0 голосов
/ 26 марта 2020

После ответа Джима Кауна ie, чтобы исключить старый Microsoft OpenMP из проекта и использовать Intel, используется следующий синтаксис:

cl /MD /openmp hello.cpp /link /nodefaultlib:vcomp /nodefaultlib:vcompd libiomp5md.lib

, исключающий MSV C OpenMP (vcomp.lib vcompd) .lib) и подключает Intel OpenMP (версия TR4: версия 5.0) (libiomp5md.lib)

Ссылка: "Использование OpenMP от INTEL"

...