Как скомпилировать программу OpenMP с использованием clang?

9

Мой gcc компилируется хорошо, но clang завершается ошибкой со следующим сообщением:

clang -fopenmp=libomp -o main main.c
main.c:5:10: fatal error: 'omp.h' file not found

Я также установил libomp5пакет и изменил флаг на -fopenmp=libomp5, хотя это тоже не помогло:

clang -fopenmp=libomp5 -o main main.c
clang: error: unsupported argument 'libomp5' to option 'fopenmp='
clang: error: unsupported argument 'libomp5' to option 'fopenmp='

эти рекомендации не сработали.

Был бы признателен за подсказки по установке необходимых 16.04 конкретных пакетов и передаче соответствующих флагов.

Булат М.
источник
Какую версию Clang вы используете? У меня та же проблема, кстати, с clang-3.8 и clang-3.9 на Ubuntu 16.10.
Z бозон
1
sudo apt установить libomp-dev
Z-бозон
Наконец, я могу использовать OpenMP с Clang на Ubuntu! Я давно этого хотел!
Z бозон

Ответы:

16

У меня такая же проблема.

sudo apt install libomp-dev

Исправлено с помощью Ubuntu 16.10

//test.c
#include "omp.h"
#include <stdio.h>

int main(void) {
  #pragma omp parallel
  printf("thread %d\n", omp_get_thread_num());
}

затем

clang test.c -fopenmp
./a.out
thread 0
thread 5
thread 2
thread 1
thread 7
thread 3
thread 4
thread 6

Также

clant-3.9 test.c -fopenmp

работает.


GCC и Clang используют разные библиотеки времени выполнения OpenMP: libgomp и libomp соответственно.

Среда выполнения Clang - это среда выполнения LLVM OpenMP, которая, в свою очередь, основана на среде выполнения Intel OpenMP (с открытым исходным кодом). https://www.openmprtl.org/

На моей системе GCC установлен omp.hна

/usr/lib/gcc/x86_64-linux-gnu/6/include/omp.h

и libomp-devнабросился omp.hна

/usr/include/omp.h

Это разные заголовочные файлы, которые содержат разные определения функций. Может быть хорошо использовать любой заголовочный файл, например, omp_get_wtime()но в целом я думаю, что, вероятно, лучше использовать заголовочный файл, который соответствует времени выполнения, с которым связан.

Z бозон
источник
1
Работал на ванили 16.04 со стоковым лязгом в репо.
Булат М.
1
Я просто установил Ubuntu 17.04, который по умолчанию установлен на Clang 4.0. Я успокоился пришлось использовать sudo apt install libomp.dev.
Z бозон
Если вы случайно свяжете libgomp из clang 6, ваш код будет автоматически сериализован.
Эндрю Вагнер
2

Кажется, файл omp.h не существует в вашей системной переменной PATH . во-первых, попробуйте найти файл omp.h, если вы не знаете, где он находится:

find / -name 'omp.h' -type f

А затем выполните эту команду для компиляции вашего кода:

clang -o main main.c -I/path/to/omp/folder
Гасем Пахлаван
источник
Это не решает проблему. Это все еще не может найти omp.h.
Z бозон
Вы нашли какой-нибудь omp.h в вашей системе? Вы можете добавить вывод этих команд в свой вопрос?
Гасем Пахлаван
*.hтакое заголовочные файлы, зачем ему добавлять их в свой путь? они должны быть, /usr/includeнапример.
Равексина
1
Спасибо Ghasem, установка libomp-dev 16.04 решена.
Булат М.