关于Mark Harris的NVIDIA并行归约Webinar中gridSize的疑问
在Mark Harris的NVIDIA并行归约示例Reduction #6里,按需调度的核心是应对数据规模超出GPU最大网格尺寸限制的场景,gridSize的设置逻辑分两种情况:
数据规模较小(未超出GPU网格上限)
此时gridSize仍按ceil(N / (blockSize * 2))计算——因为每个线程单次处理2个元素,gridSize * blockSize * 2的总处理能力刚好覆盖(或略大于)数据规模N,内核内的while循环只会执行一次,就能完成所有元素的第一轮归约。数据规模过大(超出GPU网格上限)
当ceil(N / (blockSize * 2))超过GPU支持的最大网格尺寸(比如早期GPU的gridDim.x上限为65535),此时gridSize需设为GPU的最大网格尺寸。内核内的while循环会让每个线程重复处理多组元素:每次处理的索引步长为blockSize * 2 * gridSize,直到遍历完所有数据。
你之前误以为按ceil(N/(2*workgroupSize))设置会让while循环直接退出,其实只有数据规模未超出网格上限时,循环才仅执行一次;当数据规模远超网格上限时,循环会多次执行以覆盖所有元素——这正是按需调度的核心:不依赖一次性启动足够多的块,而是让线程按需循环处理剩余元素。
另外要注意,Reduction #6的完整归约需要多轮内核调用:第一轮将N个元素归约为gridSize个结果(每个块输出一个值),第二轮以gridSize为新的数据规模重复上述逻辑,直到结果数量≤blockSize,最后用单个块完成最终归约。
内容的提问来源于stack exchange,提问作者Michael Bay

