Как использовать OpenMP в C-проекте, построенном на мезонах
Я совершенно новичок в мезон и C, пожалуйста, прости меня, если ответ на этот вопрос тривиален...
Я хочу использовать OpenMP в проекте C, и я использую мезон в качестве инструмента для сборки.
Я хочу скомпилировать parallel for
пример из этого урока. мой main.c
выглядит очень похоже:
#include <omp.h>
#define N 1000
#define CHUNKSIZE 100
int main(int argc, char *argv[]) {
int i, chunk;
float a[N], b[N], c[N];
/* Some initializations */
for (i=0; i < N; i++)
a[i] = b[i] = i * 1.0;
chunk = CHUNKSIZE;
#pragma omp parallel for \
shared(a,b,c,chunk) private(i) \
schedule(static,chunk)
for (i=0; i < N; i++)
c[i] = a[i] + b[i];
return 0;
}
Мой короткий meson.build
Файл содержит это:
project('openmp_with_meson', 'c')
# add_project_arguments('-fopenmp', language: 'c')
exe = executable('some_exe', 'src/main.c') #, c_args: '-fopenmp')
Я закомментировал c_args
ключевое слово в вызове executable
Вот.
Теперь я получаю следующие сценарии:
- без
'-fopenmp'
вариант, я получаю предупреждение, чтоpragma
неизвестно и будет проигнорировано (как я и ожидал):../src/main.c:15:0: warning: ignoring pragma omp parallel [-Wunknown-pragmas] #pragma omp parallel for
- с возможностью
c_args: '-fopenmp'
вставлено, я больше не получаю вышеупомянутое предупреждение, вместо этого я получаю ошибки для неопределенных ссылок наGOMP_parallel
,omp_get_num_threads
а такжеomp_get_thread_num
и ничего не строится - когда я использую GCC вручную с
gcc -Wall -o manually_with_gcc ../src/main.c -fopenmp
программа компилируется и выполняется без ошибок.
Может кто-нибудь сказать мне, как получить исполняемый файл для компиляции с мезон?
1 ответ
Вам нужно другое ключевое слово arg link_args : '-fopenmp'
за executable()
,
exe = executable('some_exe', 'src/main.c', c_args: '-fopenmp', link_args : '-fopenmp')
Meson строит C-программу в два этапа: компиляция и компоновка. Вы можете передать дополнительные аргументы с c_args
для составления и link_args
для ссылки.
Опция -fopenmp
включает директивы OpenMP во время компиляции и
флаг также обеспечивает автоматическое связывание библиотеки времени выполнения OpenMP.
То есть, -fopenmp
это вариант двойного назначения.
Теперь все просто и хорошо. Однако, когда вы поймете это, вы также сможете скомпилировать -fopenmp
активировать директивы OpenMP и самостоятельно связать библиотеки OpenMP без -fopenmp
к link_args
,
Вот полный meson.build
:
project('openmp_with_meson', 'c')
cc = meson.get_compiler('c')
libgomp = cc.find_library('gomp')
exe = executable('some_exe', 'src/main.c',
c_args: '-fopenmp',
dependencies : libgomp)
Мезон>= 0.46
теперь есть встроенная функция для этого (документы):
openmp = dependency('openmp') # meson builtin