【发布时间】:2013-04-09 07:39:08
【问题描述】:
我试图在我的代码中使用 OpenMP 并行化以下循环
double pottemp,pot2body;
pot2body=0.0;
pottemp=0.0;
#pragma omp parallel for reduction(+:pot2body) private(pottemp) schedule(dynamic)
for(int i=0;i<nc2;i++)
{
pottemp=ener2body[i]->calculatePot(ener2body[i]->m_mols);
pot2body+=pottemp;
}
对于函数'calculatePot',该函数内部的一个非常重要的循环也被OpenMP并行化了
CEnergymulti::calculatePot(vector<CMolecule*> m_mols)
{
...
#pragma omp parallel for reduction(+:dev) schedule(dynamic)
for (int i = 0; i < i_max; i++)
{
...
}
}
看来我的并行化涉及嵌套循环。当我删除最外层循环的并行化时, 似乎该程序的运行速度比最外层循环并行化的程序快得多。测试在 8 个核心上进行。
我认为这种并行化的低效率可能与嵌套循环有关。有人建议我在并行化最外层循环时使用“折叠”。但是,由于最外层循环和内层循环之间仍然存在一些东西,因此据说在这种情况下不能使用“折叠”。在仍然使用 OpenMP 的同时,我还有其他方法可以尝试提高这种并行化的效率吗?
非常感谢。
【问题讨论】:
-
为什么需要并行化 Poth 循环?如果
calculatePot运行时间足够长以保证包含循环的并行化,它应该提供足够的并行化来耗尽所有可用的并行资源。如果它并不总是这样做,您可以使用 omp if 子句在没有用时不并行化内部循环
标签: c++ parallel-processing nested openmp