求大神帮我注释一下这段代码:cuda并行计算圆周率的代码

发布于 2021-11-30 11:08:04 字数 2020 浏览 834 评论 5

如下这段代码:

/*


在GPU上计算PI的程序,要求块数和块内线程数都是2的幂


前一部分为计算block内归约,最后大小为块数


后一部分为单个block归约,最后存储到*pi中。


*/


   __global__ void reducePI1(float *d_sum,int num){


   int id=blockIdx.x*blockDim.x+threadIdx.x;//线程索引


   int gid=id;


   float temp;


   extern float __shared__ s_pi[];//动态分配,长度为block线程数


   s_pi[threadIdx.x]=0.0f;


   while(gid<num){
      temp=(gid+0.5f)/num;//当前x值
      s_pi[threadIdx.x]+=4.0f/(1+temp*temp);
      gid+=blockDim.x*gridDim.x;  (计算所有的线程数。blockDim.x(每块的线程数)   gridDim.x(没网格的块数)  )
   }
   for(int i=(blockDim.x>>1);i>0;i>>=1){
      if(threadIdx.x<i){
          s_pi[threadIdx.x]+=s_pi[threadIdx.x+i];
      }
      __syncthreads();
   }


   if(threadIdx.x==0)
   d_sum[blockIdx.x]=s_pi[0];
   }


   __global__ void reducePI2(float *d_sum,int num,float *d_pi){


   int id=threadIdx.x;


   extern float __shared__ s_sum[];


   s_sum[id]=d_sum[id];


   __syncthreads();


   for(int i=(blockDim.x>>1);i>0;i>>=1){


      if(id<i)
      s_sum[id]+=s_sum[id+i];
      __syncthreads();
   }


// printf("%d,%fn",id,s_sum[id]);


   if(id==0){
   *d_pi=s_sum[0]/num;
// printf("%d,%fn",id,*pi);
   }
}


//这段代码是用把区间面积加和的方法计算【0,1】区间上对1/(1+x^2)进行积分。我看不懂的地方很多,求大神能指点一下,小妹跪谢了~

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

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

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

冷清清 2021-12-01 04:36:10

不好意思,我早已不做cuda这方面的工作了,代码也早找不见了

倚栏听风 2021-12-01 03:56:20

还有caba并行计算圆周率pi的源代码吗,能不能给我一份,谢谢啦!

水水月牙 2021-12-01 03:40:28

这不就是数学题么,具体哪里不懂了啊

情栀口红 2021-11-30 23:12:07

里面gid循环的时候,为什么要整个的一次性加上所有线程呢?

海之角 2021-11-30 22:41:46

这不就是数学题么,具体哪里不懂了啊

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文