【发布时间】:2011-08-21 17:57:27
【问题描述】:
我将首先提供一些有关我遇到的问题的背景信息,以便您知道我要做什么。我一直在帮助开发某个软件工具,并发现我们可以从使用 OpenMP 并行化该软件中的一些最大循环中受益匪浅。实际上,我们成功地并行化了循环,并且仅使用两个内核,循环的执行速度提高了 30%,这是一个不错的改进。另一方面,我们注意到一个使用递归调用遍历树结构的函数中有一个奇怪的现象。在 OpenMP 开启的情况下,程序在此处实际上变慢了,并且该函数的执行时间增加了一倍多。我们认为树结构可能对并行化不够平衡,并在此函数中注释掉了 OpenMP pragma。不过,这似乎对执行时间没有影响。我们目前使用带有 -fopenmp 标志的 GCC 编译器 4.4.6 来支持 OpenMP。这是当前的问题:
如果我们不在代码中使用任何 omp pragma,一切运行良好。但是如果我们只在程序的 main 函数的开头添加以下内容,则树遍历函数的执行时间会翻倍,从 35 秒增加到 75 秒:
//beginning of main function
...
#pragma omp parallel
{
#pragma omp single
{}
}
//main function continues
...
有没有人知道为什么会发生这种情况?我不明白为什么程序会因为使用 OpenMP 编译指示而大大减慢。如果我们去掉所有的 omp pragma,树遍历函数的执行时间又会回落到 35 秒。我猜这是某种编译器错误,因为我现在没有其他解释。
【问题讨论】:
标签: performance parallel-processing openmp