我正在检查其他人的OpenMP代码并看到这三个嵌套的for循环,其中只有(第一个?)其中两个正在崩溃:
#pragma omp for collapse(2)
for(int i=0;i<nxn;i++)
for(int j=0;j<nyn;j++)
for(int k=0;k<nzn;k++)
{
rhons[is][i][j][k] += invVOL*moments[i][j][k][0];
Jxs [is][i][j][k] += invVOL*moments[i][j][k][1];
Jys [is][i][j][k] += invVOL*moments[i][j][k][2];
Jzs [is][i][j][k] += invVOL*moments[i][j][k][3];
pXXsn[is][i][j][k] += invVOL*moments[i][j][k][4];
pXYsn[is][i][j][k] += invVOL*moments[i][j][k][5];
pXZsn[is][i][j][k] += invVOL*moments[i][j][k][6];
pYYsn[is][i][j][k] += invVOL*moments[i][j][k][7];
pYZsn[is][i][j][k] += invVOL*moments[i][j][k][8];
pZZsn[is][i][j][k] += invVOL*moments[i][j][k][9];
}
我的问题是是否可以折叠所有三个循环?我的意思是我试图理解开发人员的逻辑(他应该非常有经验) - 他为什么不这样做?
答案 0 :(得分:3)
你可以这样做,但会带来什么好处?
假设nxn * nyn
明显更大OMP_NUM_THREADS
。因此,已经有循环迭代暴露于有效并行化。
另一方面,内环具有高数据局部性。虽然OpenMP可能会保留这一点,但可能会有一个特定的优化,即数组的最后一个维度是缓存行的倍数 - 因此在线程之间拆分它们是不明智的。如上所述,当折叠所有循环时,可能干扰内循环的矢量化可能成为另一个问题。
所以基本上,它没有带来任何好处,但它可能会对愚蠢的OpenMP实现的性能造成不利影响。