c++ - 如何在源文件的翻译单元中禁用 OMP?

标签 c++ openmp

我有使用 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?

最佳答案

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

#ifdef USE_OMP
#pragma omp ...
#endif

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

  • #define USE_OMP 当你想使用 OpenMP
  • 或在您想禁用它时注释行 //#define USE_OMP

这不是很优雅,但可以完成工作。

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

 pragma omp parallel sections if(USE_OMP)

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

关于c++ - 如何在源文件的翻译单元中禁用 OMP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30972774/

相关文章:

c++ - parallel_reduce on double 返回不正确的结果

c++ - OpenMP自动更新数组值

c++ - OpenMP:并行不做任何事情

c++ - 输入 SpinBox 时点击默认的 QPushButton

c++ - C/C++ 优化数据结构、数组数组或只是数组

c++ - 获取一个 std::tuple 元素作为 std::variant

c - 为什么 POSIX 线程比 OpenMP 慢

linux - MPI_Comm_size 段错误

c++ - 在 C++ 中使用声明

c++ - 如何解决 Printing Nodes and Edges Boost Graph Library 中的这个错误?