首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在用介子构建的C项目中使用OpenMP

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

Stack Overflow用户
提问于 2017-08-02 16:09:12
回答 2查看 940关注 0票数 2

我对介子和C很陌生,如果这个问题的答案是微不足道的,请原谅我。

我想在一个C项目中使用OpenMP,我正在使用meson作为构建工具。

我想从这个parallel for编译教程示例。我的main.c看起来非常相似:

代码语言:javascript
复制
#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文件包含以下内容:

代码语言:javascript
复制
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_parallelomp_get_num_threadsomp_get_thread_num的未定义引用的错误,并且不会生成任何内容。
  • 当我用gcc -Wall -o manually_with_gcc ../src/main.c -fopenmp手动使用gcc时,程序编译并执行,没有任何错误。

有人能告诉我如何用介子编译可执行文件吗?

EN

Stack Overflow用户

回答已采纳

发布于 2017-08-03 06:29:35

介子0.46或更高版本的

介子0.46 (2018年4月23日已发布) 添加OpenMP支持。所以,如果你有介子0.46或更高,

代码语言:javascript
复制
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()

代码语言:javascript
复制
exe = executable('some_exe', 'src/main.c',
                 c_args: '-fopenmp',
                 link_args : '-fopenmp')

介子分两个阶段构建C程序,编译和连接。您可以通过c_argslink_args传递额外的参数以进行编译和链接。

选项-fopenmp在编译时启用OpenMP指令,以及

该标志还安排了OpenMP运行时库的自动链接。

也就是说,-fopenmp是双重用途的选择。

现在,上面的是简单和好的。但是,一旦您理解了它,您还可以使用-fopenmp编译您的程序,以激活OpenMP指令,并自行将OpenMP库链接到而无需 -fopenmplink_args

这里是一个完整的meson.build

代码语言:javascript
复制
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)
票数 3
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45465892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档