[問題] OpenMP語法問題

看板C_and_CPP (C/C++)作者 (尼可拉斯)時間16年前 (2009/03/21 11:05), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/2 (看更多)
在一個迴圈之內進行平行處理 對於迴圈index的獨立 利用private(Index) 但是針對迴圈內的暫存變數如int_temp主要是計數的 若想要讓這個也獨立計數用private會有執行上的錯誤 例如以下小範例 #pragma omp parallel for private(p,j,i) for(s=1; s<=Size; s++) { Cross_rand[s] = rand()/32767.0; if(Cross_rand[s]<=Cross_rate) { m=m+1; if(m==2) { m=0; cross_time=cross_time+1;///////// int_temp2=s; for(p=1; p<=Period; p++) { for(i=1; i<=Fab; i++) { for(j=1; j<=Product; j++) { float_temp = F_ratio[int_temp1][p][i][j]; F[int_temp1][p][i][j] = F[int_temp2][p][i][j]; F[int_temp2][p][i][j] = float_temp; } } } } int_temp1=s; } } s為資料編號 利用機率抽取兩個資料 進行對調 如果該資料滿兩個才進行對調 針對這小範例的int_temp1,int_temp2(記錄兩筆資料的編號) m(記錄是否滿兩筆資料), float_temp(交換資料暫存) 這些變數如果因為平行處理被交叉同時存取 那必定會改變資料交換的正確性 我也查了一些語法 lastprivate: 讓每個執行緒中,都有一份變數的複本,以免互相干擾; 而在所有平行化的執行緒都結束後,會把最後的值,寫回主執行緒。 private: 讓每個執行緒中,都有一份變數的複本,以免互相干擾。 atomic: 記憶體位址將會自動更新。 這個指令的目的在於避免變數被同時修改而造成計算結果錯誤。 #pragma omp directive [clause] lastprivate, private 是屬於clause可以直接加在parallel for後面 看起來都可以讓變數避免干擾,但為什麼對於一些暫存計數變數卻會產生錯誤 但atomic屬於directive無法跟parallel for一起 請問有沒有openMP方面的高手可以幫我解答一下 謝謝了 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.118.101.120
文章代碼(AID): #19n5bu17 (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #19n5bu17 (C_and_CPP)