为 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
宏(例如,-fopenmp
和 GCC
),如果其他一切都失败了,您可以使用它。
【讨论】:
【参考方案2】:您有多种选择
-
使用现代 OpenMP 的基于任务的结构(任务循环等)。它们自然会利用嵌套并行性而不创建新线程,因此不存在超额订阅的危险。
不要设置 OMP_NESTED,在这种情况下显然嵌套的内部并行性将被展平(无论如何这可能是默认行为)。
如果您必须玩 C 宏技巧,请阅读 _Pragma,它可以让您在宏中嵌入 pragma。
【讨论】:
以上是关于为 OpenMP 函数创建别名 ||部分禁用 openMP的主要内容,如果未能解决你的问题,请参考以下文章