Как использовать 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
Другие вопросы по тегам