【问题标题】:Creating Aliases for OpenMP functions || Partially Disabling openMP为 OpenMP 函数创建别名 ||部分禁用 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 中的大块代码,但这似乎非常低效/非常不雅。

【问题讨论】:

    标签: c++ multithreading openmp preprocessor-directive


    【解决方案1】:

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

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

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

    并链接到最适合的库。

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

    【讨论】:

      【解决方案2】:

      您有多种选择

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-20
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        • 1970-01-01
        • 2012-11-27
        • 1970-01-01
        相关资源
        最近更新 更多