求大神帮我注释一下这段代码: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)进行积分。我看不懂的地方很多,求大神能指点一下,小妹跪谢了~
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
不好意思,我早已不做cuda这方面的工作了,代码也早找不见了
还有caba并行计算圆周率pi的源代码吗,能不能给我一份,谢谢啦!
这不就是数学题么,具体哪里不懂了啊
里面gid循环的时候,为什么要整个的一次性加上所有线程呢?
这不就是数学题么,具体哪里不懂了啊