请教一个OpenMP并行化嵌套循环的问题
在我的程序中,我试图对以下一个循环用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++)
{
...
}
}
所以实际上在我的并行化程序中出现了对嵌套循环的两次并行化。当我试图把最外面一层循环的并行化去掉后(仅保留calculatePot函数里的并行化),发现运行程序的速度反而比不并行快很多(8核测试)。也就是说我先前并行化的效率很低,所以我想问一下用什么方法能使我的并行化效率提高呢(假如仍然使用OpenMP,我不太想使用MPI)?网上有人建议对于嵌套循环,在最外层循环的#pragma omp parallel for后面加上collapse,但网上又说collapse仅限于嵌套的两个循环之间没有其他语句的情况。所以像我这种嵌套循环,是否还有其他方法提高并行效率呢?