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

Posted

技术标签:

【中文标题】为 OpenMP 函数创建别名 ||部分禁用 openMP【英文标题】:Creating Aliases for OpenMP functions || Partially Disabling openMP 【发布时间】:2018-03-24 21:07:29 【问题描述】:

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

IE

#define #myParallel #pragma omp parallel for
#define #myBarrier  #pragma omp barrier 

为了目的

#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 中的大块代码,但这似乎非常低效/非常不雅。

【问题讨论】:

【参考方案1】:

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

一种更简单的选择是构建您自己的库的两个版本

libfoo.so(构建没有 OpenMP) libfoo_omp.so(使用 OpenMP构建)

并链接到最适合的库。

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

【讨论】:

【参考方案2】:

您有多种选择

    使用现代 OpenMP 的基于任务的结构(任务循环等)。它们自然会利用嵌套并行性而不创建新线程,因此不存在超额订阅的危险。 不要设置 OMP_NESTED,在这种情况下显然嵌套的内部并行性将被展平(无论如何这可能是默认行为)。 如果您必须玩 C 宏技巧,请阅读 _Pragma,它可以让您在宏中嵌入 pragma。

【讨论】:

以上是关于为 OpenMP 函数创建别名 ||部分禁用 openMP的主要内容,如果未能解决你的问题,请参考以下文章

OpenMP 为内联函数声明 SIMD

在运行时本地启用/禁用 OpenMP

无法为长命令创建 bash 别名或函数

openmp怎么用函数配置线程数

第1次作业

在 Openmp (C++) 中销毁线程