Могут ли / должны libiomp5 и libgomp смешаться?

Мы компилируем приложение, которое использует OpenMP. Мы используем gcc 4.4, с -fopenmp. Приложение также использует IPP, который включает в себя собственную версию OpenMP (libiomp5). (Примечание: мы отключаем внутреннюю многопоточность IPP, вызывая ippSetNumThread(1). Согласно документации Intel, этого следует избегать конфликтов с другими библиотеками многопоточности. Однако соединение с IPP по-прежнему связывается с libiomp5.so.)

Поскольку libiomp5.so уже подключен, мы не связывались с libgomp.so (версия OpenMP от gcc). Долгое время это работало, но после, казалось бы, несущественного изменения, мы начали видеть очень странные сбои, связанные с OpenMP, на одной из четырех поддерживаемых нами платформ (остальные три платформы по-прежнему работают нормально).

Я могу устранить сбои, если у меня есть ссылка на libgomp.so, а также на libiomp5.so.

У меня есть пара вопросов по этому поводу:

  1. Безопасна ли связь с обеими этими библиотеками? Кажется, что они оба определяют одни и те же символы.
  2. Есть ли способ сказать, какую версию OpenMP поддерживает libiomp5.so? С gcc 4.4 libgomp.so должен быть в OpenMP v3.0. Я не могу найти никакой информации в документации Intel о OpenMP-версии libiomp5.so.

1 ответ

Решение

Поскольку никто не ответил в течение нескольких дней, я просто сообщу, что я узнал самостоятельно:

Безопасна ли связь с обеими этими библиотеками? Вот самая полезная страница, которую я нашел по этой теме: http://software.intel.com/sites/products/documentation/studio/composer/en-us/2011/compiler_c/optaps/common/optaps_par_openmp_multiple_compilers.htm

Корпорация Intel рекомендует, чтобы, если вы собираетесь смешивать внутреннюю многопоточность OpenMP IPP с вашей собственной многопоточностью OpenMP, вы ссылаетесь на libiomp5 вместо библиотеки OpenMP вашего компилятора. Текущая версия libiomp5 обеспечивает "совместимость с исходным кодом и совместимость на уровне объекта" с OpenMP для gcc, но только если вы используете gcc "4.42" (sic; я предполагаю, что они имеют в виду 4.4.2) или более позднюю версию.

Есть ли способ сказать, какую версию OpenMP поддерживает libiomp5.so? Да. Установите переменную среды KMP_VERSION=1, затем запустите ваше приложение. Вы получите отладочный вывод, напечатанный libiomp5, на вашу консоль. Если вы используете IPP v7 или новее, одна строка будет что-то вроде

Intel(R) OMP API version: 3.0 (200805)

Если вы используете IPP 6, он не сообщит вам версию API, но сообщит, когда он был создан и с какой версией компилятора Intel. Затем вы можете проверить, какая версия OpenMP поддерживается этим компилятором. (11.0 была первой версией компилятора Intel, поддерживающей OpenMP v3.0.)

Другие вопросы по тегам