如何在用介子构建的 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
关键字。
现在我得到以下场景:
- 没有
'-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 -Wall -o manually_with_gcc ../src/main.c -fopenmp
手动使用 gcc 时,程序编译和执行没有任何错误。
谁能告诉我如何使用介子编译可执行文件?
介子 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 库 没有 -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)
Meson >= 0.46
现在有一个内置函数 (docs):
openmp = dependency('openmp') # meson builtin
我对介子和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
关键字。
现在我得到以下场景:
- 没有
'-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 -Wall -o manually_with_gcc ../src/main.c -fopenmp
手动使用 gcc 时,程序编译和执行没有任何错误。
谁能告诉我如何使用介子编译可执行文件?
介子 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 库 没有 -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)
Meson >= 0.46
现在有一个内置函数 (docs):
openmp = dependency('openmp') # meson builtin