對不起,我剛開始學習OpenMP,所以我有點困惑。 我正在分析我的分子動力學模擬和代碼的一部分,我試圖找到水分子(或離子)和蛋白質之間的最近距離。這是非常耗時的部分,因爲我有大約50萬個原子和大約25000個幀。通過單個CPU需要1周(對於一組計算,不僅是距離)。OpenMP for loop不會給出正確的結果
我改變了這部分代碼通過的OpenMP並行,這是非常快,但有一個小錯誤;與單個CPU代碼相比,90%的結果(距離)是正確的,10%是錯誤的。 這是我的代碼的一部分,它計算的最近距離:
...
for (i=0; i< number of frames(25000))
...
// XP,YP,ZP protein coordinates; malloc allocation in the code
// XI,YI,ZI Sodium molecule coordinates; malloc allocation
// LX,LY,LZ the dimension of simulation box, malloc allocation
// dimI defined as a temporary closest distance, filled with very large constant,
// malloc allocation
// NSOD number of Sodium molecules
// rhos keeping the closest distance for each Sodium for each frame.
…
...int l=0,kk=0;
#pragma omp parallel for shared(XI,YI,ZI,XP,YP,ZP,LX,LY,LZ,qq,dimI,distI,rhos,xmin,ymin,zmin,i) private(kk,l)
for (l=0; l < NSOD; l++){
// this part relocates every thing inside a box with dimension LX*LY*LZ. xmin, ymin and zmin are the boundaries of the box.
if (XI[l]!=0.0 || YI[l]!=0.0 || ZI[l]!=0.0){
if (XI[l] < xmin) XI[l] += ceil((xmin - XI[l])/LX[i-1]) * LX[i-1];
if (XI[l] > xmax) XI[l] -= ceil((XI[l] - xmax)/LX[i-1]) * LX[i-1];
if (YI[l] < ymin) YI[l] += ceil((ymin - YI[l])/LY[i-1]) * LY[i-1];
if (YI[l] > ymax) YI[l] -= ceil((YI[l] - ymax)/LY[i-1]) * LY[i-1];
if (ZI[l] < zmin) ZI[l] += ceil((zmin - ZI[l])/LZ[i-1]) * LZ[i-1];
if (ZI[l] > zmax) ZI[l] -= ceil((ZI[l] - zmax)/LZ[i-1]) * LZ[i-1];
}
for (kk=0; kk<NP; kk++){
if ((XP[kk]!=0. || YP[kk]!=0. || ZP[kk]!=0.) ){
distI[l] = sqrt((XI[l]-XP[kk])*(XI[l]-XP[kk]) + (YI[l]-YP[kk])*(YI[l]-YP[kk]) + (ZI[l]-ZP[kk])*(ZI[l]-ZP[kk]));
if (distI[l] < dimI[l]) {
dimI[l] = distI[l];
}
}
}
distI[l] = dimI[l];
rhos[qq][l] = dimI[l];
} 的#pragma OMP屏障 ...
你能告訴我什麼是錯與並行後,我的代碼?爲什麼只在某些情況下給出了錯誤的答案,而不是所有的情況?我非常感謝您的意見和建議。我在linux上使用gcc。 非常感謝你,
乾杯, 阿拉什
嗨安德斯,我會申請後你的建議,謝謝,阿拉什 – Arash