【问题标题】:How to disable OMP in a translation unit at the source file?如何在源文件的翻译单元中禁用 OMP?
【发布时间】:2015-06-22 05:43:49
【问题描述】:

我有使用 OMP 工具编写的 C/C++ 源文件。例如,在 C++ 类文件中:

#pragma omp parallel sections
{
    #pragma omp section
        cp = ModularSquareRoot(cp, m_p);
    #pragma omp section
        cq = ModularSquareRoot(cq, m_q);
}

为了进行基准测试和测试,我想用-fopenmp 构建库,但在这个特定的类文件上禁用它。我希望我可以在类的头文件中添加类似#pragma omp disable 或类似的内容,以便为翻译单元禁用它。但是#pragma omp disable 被默默地忽略了。

我已经浏览了Using OpenMP: Portable Shared Memory Parallel Programming,但我还没有看到如何去做。 (我很可能会错过它,因为我还没有完全阅读它)。

我试图避免修改 CXXFLAGS、makefile 配方和 Visual Studio 项目设置。

有没有办法在源文件的特定翻译单元中禁用 OMP?

【问题讨论】:

  • 相关:123
  • 谢谢阿维。它们都不适用。 (1) 使用 Cmake,这是一个基于 makefile 的项目。 (2) 要求我修改makefile 和recipes。 (3) 为整个程序禁用它。我有兴趣一次为一个翻译单元禁用它,而无需为翻译单元做更多的#pragma omp off。当然,我不是唯一一个想要这样做的人......
  • 3 本身并不禁用整个程序。您可以将 omp_set_num_threads(1); 放在翻译单元的开头,将 omp_set_num_threads(backed_up_N); 放在末尾,有效地消除并行化(实际上并没有禁用 OMP)。
  • 备注:使用 omp_set_num_threads(1); 或禁用 OMP 会产生不同的行为。设置omp_set_num_threads(1); 会显示更慢。因此,对于基准测试,我更喜欢禁用它以衡量并行效率。
  • @coincoin 同意。我以为我在评论中说得很清楚,但澄清总是好的。

标签: c++ openmp


【解决方案1】:

我不确定您能否以“简单”的方式做到这一点。
我想出的解决方案是使用#define 为特定文件打开/关闭 OpenMP 并包装您的编译指示:

#ifdef USE_OMP
#pragma omp ...
#endif

然后在你的头文件的顶部,然后你可以指定

  • #define USE_OMP 当你想使用 OpenMP 时
  • 或在您想禁用它时评论//#define USE_OMP 行。

这不是很优雅,但确实有效。

正如 Avi Ginsburg 的 cmets 所指出的,您还可以使用 OpenMP 中的 if 子句:

 pragma omp parallel sections if(USE_OMP)

其中USE_OMP 设置为真或假。 但是,我不确定此解决方案是否会提供与禁用 OpenMP 相同的行为。请注意,根据您的 OpenMP 版本,该子句可能不适用于您的所有指令。

【讨论】:

  • 正如 OP 所指出的,他不想修改“修改 makefiles and recipes”。
  • 您可以通过在编译指示中使用if 子句来使其更简单。
  • 我不是这个意思。编译指示将是#pragma omp ... if(USE_OMP)...,没有#if#ifdef;定义为#define USE_OMP true#define USE_OMP false
  • 哦,我明白你的意思是来自 omp pragma 的 if。我不确定它是否会像完全禁用 OpenMP 那样保证没有开销。此外,它仅适用于 omp foromp sections 指令。由于我们并不完全了解代码的作者。但我会添加你的解决方案,看起来也不错。
  • @coincoin 什么 omp pragma 不适用于 if 子句?任务 (omp >=3.0) 使用 it。 Microsoft 停留在 omp 2.0,因此他们的文档没有反映较新的选项。
猜你喜欢
  • 2021-12-31
  • 2012-06-06
  • 2019-01-12
  • 1970-01-01
  • 1970-01-01
  • 2015-08-02
  • 2019-09-20
  • 2021-05-25
  • 1970-01-01
相关资源
最近更新 更多