首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为OpenMP函数创建别名||部分禁用openMP

为OpenMP函数创建别名||部分禁用openMP
EN

Stack Overflow用户
提问于 2018-03-25 05:07:29
回答 2查看 65关注 0票数 1

是否可以为openMP名称创建预处理别名?

代码语言:javascript
复制
#define #myParallel #pragma omp parallel for
#define #myBarrier  #pragma omp barrier 

为了…目的

代码语言:javascript
复制
#ifdef MY_LIB_DISABLE_OPENMP
#define #myParallel 
#define #myBarrier
#else
#define #myParallel #pragma omp parallel for
#define #myBarrier  #pragma omp barrier 
#endif

我有两个库,都使用openmp。第一个库(并行化)调用第二个库(也是并行化的)中的函数,我相信这会导致指数级的线程数量。我希望能够禁用第二个库的openmp调用。(这两个库都是我的,所以我可以修补一下)。

唯一的另一种解决方案是复制/粘贴包装在#ifdef #else中的大量代码,但这似乎非常低效/非常不优雅。

EN

回答 2

Stack Overflow用户

发布于 2018-03-25 10:57:16

OpenMP运行时不太可能创建指数级数量的线程。

一种更简单的方法是构建自己的库的两个版本

  • libfoo.so (在没有 OpenMP)
  • libfoo_omp.so的情况下构建(使用OpenMP构建OpenMP)

并链接到最适合的库。

C在使用_OPENMP标志调用时定义了OpenMP宏(例如,带有GCC-fopenmp ),如果其他一切都失败了,您可以使用它。

票数 1
EN

Stack Overflow用户

发布于 2018-03-26 16:19:01

您有多种选择

  1. 使用了现代OpenMP的基于任务的结构(任务循环等)。它们将自然地利用嵌套并行性,而无需创建新线程,因此不存在oversubscription.
  2. Don't set OMP_NESTED的危险,在这种情况下,明显嵌套的内部并行性将被扁平化(这很可能是默认行为)。
  3. 如果您必须使用C宏技巧,请阅读_Pragma,它允许您在宏中嵌入编译指示。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49469969

复制
相关文章

相似问题

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