如何在用介子构建的 C 项目中使用 OpenMP

How to use OpenMP in a C project built with meson

我对介子和C很陌生,如果这个问题的答案很简单,请原谅我...

我想在 C 项目中使用 OpenMP,我正在使用介子作为构建工具。
我想从这个 tutorial 编译 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')

我在此处对 executable 的调用中注释掉了 c_args 关键字。
现在我得到以下场景:

谁能告诉我如何使用介子编译可执行文件?

介子 0.46 或更高版本

介子 0.46(released Apr 23, 2018) added OpenMP support。所以,如果你有介子 0.46 或更高版本,

project('openmp_with_meson', 'c')
omp = dependency('openmp')
exe = executable('some_exe', 'src/main.c',
                 dependencies : omp)

应与 GCC 和 Clang 一起工作。

介子 0.45 或更早版本

如果您碰巧有旧版本,Debian Stretch,Ubuntu Bionic (18.04LTS),或 Fedora 27,您可以执行以下操作:

executable().

需要另一个关键字参数 link_args : '-fopenmp'
exe = executable('some_exe', 'src/main.c',
                 c_args: '-fopenmp',
                 link_args : '-fopenmp')

Meson 分两个阶段构建 C 程序,编译和 linking。您可以使用 c_args 传递额外的参数进行编译,使用 link_args 传递 linking.

选项 -fopenmp 在编译时启用 OpenMP 指令,并且

the flag also arranges for automatic linking of the OpenMP runtime library.

也就是说,-fopenmp 是双用途选项。

现在,上面的内容简单又好。然而,一旦你理解了它,你也可以编译你的程序 -fopenmp 来激活 OpenMP 指令和 link OpenMP 库 没有 -fopenmplink_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)

Meson >= 0.46 现在有一个内置函数 (docs):

openmp = dependency('openmp') # meson builtin