Укажите OpenMP для GCC - PullRequest
       10

Укажите OpenMP для GCC

24 голосов
/ 15 июня 2011

Для OpenMP, когда мой код использует функции в своем API (например, omp_get_thread_num ()) без использования его директив (таких как #pragma omp ...),

  1. почему прямое указание libgomp.a для gcc вместо использования -fopenmp не работает, например

    gcc hello.c /usr/lib/gcc/i686-linux-gnu/4.4/libgomp.a  -o hello
    

    Обновление: Я только что обнаружил, что ссылка на libgomp.a неработает, но ссылка на libgomp.so работает.Означает ли это, что OpenMP не может быть статически связан?

  2. Почему -fopenmp работает только без указания файлов библиотеки

    gcc hello.c -fopenmp -o hello
    

    Обновление: Другими словами, при использовании -fopenmp почему явноссылка на libgomp.so не требуется?

  3. Почему это также компилируется:

    gcc hello.c -L/usr/lib/gcc/i686-linux-gnu/4.4/ -lgomp -o hello
    

    Будет ли это игнорировать директивы OpenMP в коде, если они есть?

Спасибо и всего наилучшего!

1 Ответ

25 голосов
/ 15 июня 2011

В общем, имейте в виду, что директивы и функции - это разные вещи;первые контролируются -fopenmp, а вторые - связью с библиотекой OpenMP.

  1. ( Обновлено для включения комментариев ) Попробуйте использовать -fopenmpи -static опции для статической связи OpenMP.Поскольку это подразумевает -lgomp -lrt, следующая команда не будет правильно скомпилирована, если вы не укажете местоположение librt.a.

    gcc hello.c /usr/lib/gcc/i686-linux-gnu/4.4/libgomp.a  -o hello
    
  2. ( Обновлено для включения комментариев ) Я полагаю, что следующая команда компилируется правильно, поскольку библиотека OpenMP уже находится в пути к вашей библиотеке, а динамический компоновщик вашей системы автоматически связывается с libgomp.so.

    gcc hello.c -fopenmp -o hello
    
  3. Следующая команда, вероятно, правильно компилируется, поскольку она ссылается на общий объект для OpenMP (libgomp.so).Обратите внимание, что для параметра -static используется , а не .

    gcc hello.c -L/usr/lib/gcc/i686-linux-gnu/4.4/ -lgomp -o hello
    

    Если вы не укажете параметр -fopenmp, директивы OpenMP следует игнорировать.

...