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不去等待之呢?各位有何解决方案。
阅读 7.1k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏