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

时间:2018-03-24 21:07:29

标签: c++ multithreading openmp preprocessor-directive

是否可以为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调用。 (这两个lib都是我的,所以我可能会修补)。

唯一的另一个解决方案是复制/粘贴包裹在#ifdef #else中的大块代码,但这看起来非常低效/非常不优雅。

2 个答案:

答案 0 :(得分:1)

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

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

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

并链接到最适合的库。

注意C在使用OpenMP标志(例如_OPENMP-fopenmp)调用时定义GCC宏,如果其他所有内容都失败,您可以使用它。

答案 1 :(得分:0)

您有多种选择

  1. 使用现代OpenMP的基于任务的构造(taskloop等)。他们将自然地利用嵌套并行性而不创建新线程,因此不存在超额认购的危险。
  2. 不要设置OMP_NESTED,在这种情况下,显然嵌套的内部并行性将被展平(这可能是默认行为)。
  3. 如果你必须玩C宏技巧,请阅读_Pragma,它允许你在宏中嵌入编译指示。