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

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

嘦怹 发布于 2021-11-30 字数 2176 浏览 819 回复 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)进行积分。我看不懂的地方很多,求大神能指点一下,小妹跪谢了~

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

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

评论(5

冷清清 2021-12-01 5 楼

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

倚栏听风 2021-12-01 4 楼

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

水水月牙 2021-12-01 3 楼

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

情栀口红 2021-11-30 2 楼

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

海之角 2021-11-30 1 楼

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