CUDA __syncthreads 同步锁 在同一个block内不工作

发布于 2022-08-28 12:51:58 字数 927 浏览 26 评论 0

代码

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文