我对介子和C很陌生,如果这个问题的答案是微不足道的,请原谅我。
我想在一个C项目中使用OpenMP,我正在使用meson作为构建工具。
我想从这个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 -Wall -o manually_with_gcc ../src/main.c -fopenmp
手动使用gcc时,程序编译并执行,没有任何错误。有人能告诉我如何用介子编译可执行文件吗?
发布于 2017-08-03 06:29:35
介子0.46或更高版本的
介子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拉伸版,Ubuntu Bionic版(18.04LTS)或Fedora 27版本,您可以执行以下操作:
您需要另一个关键字arg link_args : '-fopenmp'
用于executable()
。
exe = executable('some_exe', 'src/main.c',
c_args: '-fopenmp',
link_args : '-fopenmp')
介子分两个阶段构建C程序,编译和连接。您可以通过c_args
和link_args
传递额外的参数以进行编译和链接。
选项-fopenmp
在编译时启用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)
https://stackoverflow.com/questions/45465892
复制相似问题