CUDA __syncthreads 同步锁 在同一个block内不工作
代码
__device__ void calcucell::procsignal(int i)
{
if(lu.x==10&&lu.y==10)
{
//i=30;
//u[5][5]=1;
u[5][5]=sinf( (float)i/1000 )*1;
udot[5][5]=0;//cos( (float)i/1000 )/1000;
//udot[5][5]=cos( (float)i/1000 )*1;
}
else
{
//sinf( (float)i/1000 )*1;
}
flap[id]+=__syncthreads_count(5678);
//flap[id]+=__syncthreads_count(1234);
}
症状
对于这个函数而言,每个thread的(lu.x,lu,y) 是唯一的,网上常见的是不在一个block内于是无法同步,我这边检查无误,我打印了
flap[id]
值为
0 :24
1 :24
2 :24
3 :24
4 :24
5 :24
6 :1
7 :24
8 :24
9 :24
如果我注释掉第三行的if语句或者在else内加入一个sinf,则一切正常,打印为
0 :25
1 :25
2 :25
3 :25
4 :25
5 :25
6 :25
7 :25
8 :25
9 :25
根据我的测试,只有出现sinf之类的语句同步才会失败,如果sinf那行仅仅改成改成
u[5][5]=((float )i)/1000
则畅通无阻
自己的分析
是否是sinf费时间太久,让其他thread不去等待之呢?各位有何解决方案。
Porsche
11 years, 9 months ago