Harris归约优化第4阶段网格尺寸及CUDA循环展开内核配置问题
双加载归约的grid大小配置规则
你的推测是正确的,相比无多加载的基础归约配置,该场景下grid.x确实可以设置为原配置的1/2,只需额外注意向上取整避免遗漏元素即可,具体逻辑如下:
- 首先拆解代码负载逻辑:该代码中每个线程单次迭代会加载2个元素(
g_idata[i]和g_idata[i+blockSize]),每个block覆盖的总元素数为blockSize * 2,而无多加载的基础归约中每个block仅覆盖blockSize个元素,因此相同数据量下所需的block数直接减半。 - 具体计算公式:
无多加载的基础归约grid计算公式为:
对应这个双加载场景,调整为:grid.x = (n + blockSize - 1) / blockSize; // 向上取整计算所需block数
和你之前接触的4路循环展开逻辑完全一致:每线程单次处理N个元素时,grid大小就对应缩小为原配置的1/N,本质是按单block覆盖的元素规模等比例缩小grid规模。grid.x = (n + 2 * blockSize - 1) / (2 * blockSize); - 额外补充:代码中的while循环实现了grid跨步遍历逻辑,哪怕你设置的grid比上述公式计算的最小规模更小,代码也能正常跑完所有数据,只是每个线程会多跑几次循环。实际生产环境中你也可以根据设备的SM数量,将grid大小调整为SM数的2~4倍来获得更高的流式多处理器占用率,不需要严格卡死刚好除以2的最小规模。
内容的提问来源于stack exchange,提问作者kingwales
相关产品推荐
相关产品推荐

