求大神帮我注释一下这段代码:cuda并行计算圆周率的代码
如下这段代码:
/*
在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扫描下方二维码加群参与讨论,获取更多帮助。

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