2

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

我想在 C 项目中使用 OpenMP,并且我使用介子作为构建工具。
我想编译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,并且没有构建任何内容
  • 当我手动使用 gccgcc -Wall -o manually_with_gcc ../src/main.c -fopenmp程序编译并执行时没有任何错误。

谁能告诉我如何让可执行文件与介子一起编译?

4

2 回答 2

3

介子 0.46 或更高版本

Meson 0.46(2018 年 4 月 23 日发布)添加了 OpenMP 支持。所以,如果你有介子 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,您可以执行以下操作:

您需要另一个关键字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 库链接到. -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)
于 2017-08-03T06:29:35.243 回答
2

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

openmp = dependency('openmp') # meson builtin
于 2020-06-30T16:31:04.730 回答