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不去等待之呢?各位有何解决方案。

cuda nvidia 并行 同步锁

Porsche 11 years, 8 months ago

Your Answer