在我的c++项目中禁用OpenMP pragma语句



在我的c++项目中,有几个#pragma omp parallel for private(i)语句。当我尝试使用valgrind来跟踪代码中的bug时,OpenMP修饰会导致"可能丢失"的内存泄漏消息。我想完全禁用上述所有#pragma语句,以便我可以隔离问题。

然而,我在我的代码中使用omp_get_wtime(),我不希望禁用这些函数调用。所以我不想在我的项目中完全禁用所有的OpenMP功能。

我怎么能简单地关闭所有的#pragma omp parallel for private(i)语句?

我使用Eclipse CDT来自动管理makefile,因此我通常在发布模式下通过:make all -C release进行编译。理想情况下,我希望我的问题的解决方案,允许我编译使用语句,如make all -C release -TURN_OFF_PARALLEL,这将导致所有上述#pragma语句被关闭。

最简单的解决方案是:

  1. 禁用OpenMP
  2. 链接OpenMP存根库函数

如果您的OpenMP实现不提供存根函数,您可以从标准的附录B中创建自己的副本。

围绕一个关于不工作的OpenMP代码的有趣问题进行了一些讨论之后,事实证明,通过仅将-fopenmp替换为-lgomp,完全有可能获得与GCC等效的存根OpenMP库。我怀疑这是一个有意为之的功能,但它仍然是开箱即用的。

对于GCC,我没有看到只使用存根的选项。OpenMP标准的附录B说

    double omp_get_wtime(void)
    {
    /* This function does not provide a working
    * wallclock timer. Replace it with a version
    * customized for the target machine.
    */
    return 0.0;
    }

如果你真的想要时间,那就没用了。使用GCC,要么你必须自己编写时间函数,要么你搜索"#pragma omp"并将其替换为"//#pragma omp"

你可以只为GCC实现你自己的time函数,而不是改变整个代码库。linux中的计算时间:粒度和精度

最新更新