Могут ли / должны libiomp5 и libgomp смешаться? - PullRequest
4 голосов
/ 28 декабря 2010

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

Поскольку libiomp5.so уже подключена, у нас not была ссылка на 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 Ответ

4 голосов
/ 04 января 2011

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

Безопасна ли связь с обеими этими библиотеками? Вот самая полезная страница, которую я нашел по этой теме: 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.)

...