[問題] OpenMP語法問題
看板C_and_CPP (C/C++)作者nicholas1119 (尼可拉斯)時間16年前 (2009/03/21 11:05)推噓0(0推 0噓 0→)留言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
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 2 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章