在OpenMP中折叠两个for循环中的三个for循环

时间:2016-10-21 15:17:44

标签: loops for-loop openmp

我正在检查其他人的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];
  }

我的问题是是否可以折叠所有三​​个循环?我的意思是我试图理解开发人员的逻辑(他应该非常有经验) - 他为什么不这样做?

1 个答案:

答案 0 :(得分:3)

你可以这样做,但会带来什么好处?

假设nxn * nyn明显更大OMP_NUM_THREADS。因此,已经有循环迭代暴露于有效并行化。

另一方面,内环具有高数据局部性。虽然OpenMP可能会保留这一点,但可能会有一个特定的优化,即数组的最后一个维度是缓存行的倍数 - 因此在线程之间拆分它们是不明智的。如上所述,当折叠所有循环时,可能干扰内循环的矢量化可能成为另一个问题。

所以基本上,它没有带来任何好处,但它可能会对愚蠢的OpenMP实现的性能造成不利影响。