Подтвердить что ты не робот

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

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

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

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

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

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

    gcc hello.c -fopenmp -o hello
    

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

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

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

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

Спасибо и приветствую!

4b9b3361

Ответ 1

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

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

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

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

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

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