首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Harris‘s Parallel Reduction教程中,翘曲循环展开是如何工作的?

在Harris‘s Parallel Reduction教程中,翘曲循环展开是如何工作的?
EN

Stack Overflow用户
提问于 2021-08-30 05:40:55
回答 1查看 53关注 0票数 0

我正在关注Mark Harris的reduction in CUDA演讲。我已经到了优化步骤#5,我被warpReduce()函数的主要逻辑搞糊涂了:

代码语言:javascript
复制
__device__ void warpReduce(volatile int* sdata, int tid) {
  sdata[tid] += sdata[tid + 32]; // line A
  sdata[tid] += sdata[tid + 16]; // line B
  sdata[tid] += sdata[tid + 8];
  sdata[tid] += sdata[tid + 4];
  sdata[tid] += sdata[tid + 2];
  sdata[tid] += sdata[tid + 1];
}

我的问题是关于A行:为什么我们需要sdata[tid] += sdata[tid + 32]?如果是tid < 32,那么它应该从sdata[tid] += sdata[tid + 16]开始?否则会超出范围吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-30 09:13:54

解释是,在对warpReduce()函数的调用中,每个warp处理两个输入元素,因此每个warp 32*2 = 64个元素。

看看你链接的幻灯片中的幻灯片14 -你会看到线程的数量是他们正在处理的元素数量的一半。

但我同意这有点令人惊讶/困惑,因为在之前的幻灯片中,are s的条件是s < blockDim.x,所以只处理bit Dim.x元素。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68979364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档