在my c++;项目 在我的C++项目中,有几个代码,用于对私有(i)< /C>语句进行并行处理。当我试图使用valgrind跟踪代码中的bug时,OpenMP装饰会导致“可能丢失”内存泄漏消息。我想完全禁用前面提到的所有#pragma语句,以便隔离问题

在my c++;项目 在我的C++项目中,有几个代码,用于对私有(i)< /C>语句进行并行处理。当我试图使用valgrind跟踪代码中的bug时,OpenMP装饰会导致“可能丢失”内存泄漏消息。我想完全禁用前面提到的所有#pragma语句,以便隔离问题,c++,macros,openmp,pragma,C++,Macros,Openmp,Pragma,但是,我在代码中使用了omp\u get\u wtime(),我不希望禁用这些函数调用。所以我不想在我的项目中完全禁用所有OpenMP功能 如何简单地关闭所有私有(I)语句的#pragma omp parallel 我使用EclipseCDT自动管理makefiles,因此我通常通过:makeall-C release在发布模式下编译。理想情况下,我希望有一个解决问题的方案,允许我使用诸如make all-C release-tun\u PARALLEL之类的语句进行编译,这将导致所有上述#pr

但是,我在代码中使用了
omp\u get\u wtime()
,我不希望禁用这些函数调用。所以我不想在我的项目中完全禁用所有OpenMP功能

如何简单地关闭所有私有(I)语句的
#pragma omp parallel


我使用EclipseCDT自动管理makefiles,因此我通常通过:
makeall-C release
在发布模式下编译。理想情况下,我希望有一个解决问题的方案,允许我使用诸如
make all-C release-tun\u PARALLEL
之类的语句进行编译,这将导致所有上述
#pragma
语句被关闭。

最简单的解决方案是:

  • 禁用OpenMP
  • 链接OpenMP存根库函数

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

    对于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实现自己的时间函数,而不是更改整个代码库。

    在对一个不工作的OpenMP代码进行了一些讨论之后,事实证明,只需将
    -fopenmp
    替换为
    -lgomp
    ,就完全有可能获得与GCC相当的存根OpenMP库。我怀疑这是一个预期的功能,但它是开箱即用的。

    你能详细说明一下“链接OpenMP存根库函数”是什么意思吗?这个想法是将串行库与
    omp.h
    中定义的API链接起来。有些编译器提供了一个标志来实现这一点,所以您只需要在编译时更改一个标志。例如,这是一个关于使用
    boost::timer
    而不是OpenMP
    omp\u get\u wtime()
    函数的问题,您的看法是什么?因为我没有使用任何其他OpenMP功能。我看不出有任何问题that@Massimiliano,如何仅链接GCC中的存根函数?在Visual Studio中,这不是问题,因为omp_get_wtime在没有设置OpenMP支持的情况下工作。在ICC中,您可以使用-openmp存根。我看不到GCC的选项。这样看:实现存根
    omp\u get\u wtime()
    您可以在一个地方修改外部替换库。您的建议是潜在地修改项目的所有代码库。是的,我理解,但编写自己的准确跨平台计时函数可能会很痛苦,这就是使用omp_get_wtime()的全部意义。