在我的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
语句被关闭。
最简单的解决方案是:
- 禁用OpenMP
- 链接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中的计算时间:粒度和精度