2
我檢查別人的OpenMP代碼摺疊兩個用於-循環了三次,看到這三個嵌套for循環,只有(第一個?)有兩個人被倒塌:OpenMP中
#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];
}
我的問題是,是否有可能崩潰所有三個循環?我的意思是我試圖理解開發者的邏輯(他應該是非常有經驗的) - 爲什麼他沒有這樣做?
摺疊外層循環的動機是將工作更均勻地分佈在各個線程之間。將內部循環包含在崩潰中會干擾向量化,可能會阻止它,除非您設置simd並使用合適的編譯器。 – tim18
接受的答案是錯誤的! –
好的,如果這些回覆仍然令人困惑,collapse(2)會合並2個外部循環,並使內部循環受制於編譯器設置,例如自動向量化。這可能是一個不錯的選擇。 – tim18