cuda - 进行多次添加时如何理解并行减少的步幅大小?
问题描述
我正在学习 Mark Harris 的 Optimizing Parallel Reduction的实现。
我对第 32 页上的这几行感到困惑:
unsigned int tid = threadIdx.x;
unsigned int i = blockIdx.x*(blockSize*2) + threadIdx.x;
unsigned int gridSize = blockSize*2*gridDim.x;
sdata[tid] = 0;
while (i < n){
sdata[tid] += g_idata[i] + g_idata[i+blockSize];
i += gridSize;}
__syncthreads();
为什么这里是网格步幅gridSize = blockSize*2*gridDim.x;
?根据我的理解,我们应该一个一个地计算网格?所以应该是gridSize = blockSize*gridDim.x;
?
解决方案
这里的答案与您上一个问题的答案非常相似。块(或网格)中的每个线程处理数据集中的两个元素:
sdata[tid] += g_idata[i] + g_idata[i+blockSize]
element 1 element 2
对于网格的每一步。因此,如果我们根据每步处理的元素数量来衡量网格步长,则该数字是线程中网格尺寸的两倍。
线程中的网格大小:
gridSize = blockSize*gridDim.x;
每步处理的元素数量的网格大小:
gridSize = 2*blockSize*gridDim.x;
推荐阅读
- vuejs2 - vue中的自定义业务对象
- c# - 在方法中更新 MDC
- java - 使用javafx直接从接口中删除数据库中的数据
- python - 使用 for binarizer 和 for 循环替换 pandas 列中每一行的单元格值
- php - OAuth 返回错误的请求消息
- java - 为什么在单选按钮或复选框上应用时不显示错误消息
- ibm-watson - 如何为特定领域的聊天机器人准备数据
- c - 在动态布尔数组上使用 memset 是否定义明确?
- php - 使用ajax获取dataTable数据
- nunit - Bamboo NUnit Parser 任务失败,因为预期有测试用例,但没有找到