作者nicholas1119 (尼可拉斯)
看板C_and_CPP
标题[问题] OpenMP语法问题
时间Sat Mar 21 11:05:22 2009
在一个回圈之内进行平行处理
对於回圈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