3

在我的 c++ 项目中,有几个#pragma omp parallel for private(i)语句。当我尝试使用 valgrind 跟踪代码中的错误时,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语句都被关闭。

4

3 回答 3

2

The simplest solution is to:

  1. disable OpenMP
  2. link the OpenMP stub library functions

In case your OpenMP implementation doesn't provide stub functions, you can create your own copying from Appendix B of the standard.

于 2013-06-13T19:25:22.547 回答
2

在对一个关于非工作 OpenMP 代码的有趣问题-fopenmp进行了一些思考之后,事实证明,完全有可能通过仅用-lgomp. 我怀疑这是一个预期的功能,但它仍然可以开箱即用。

于 2015-10-16T13:36:01.537 回答
1

对于 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 实现自己的时间函数,而不是更改整个代码库。 linux中的计算时间:粒度和精度

于 2013-06-14T08:35:14.457 回答