当核心数量不够或想限制当前任务使用的GPU核心数时可以使用网格跨步的思路编写CUDA程序。
CUDA的执行配置:
[gridDim, blockDim]
中的blockDim
最大只能是1024,但是并没提到gridDim
的最大限制。英伟达给出的官方回复是gridDim最大为一个32位整数的最大值,也就是2,147,483,648,大约二十亿。这个数字已经非常大了,足以应付绝大多数的计算,但是如果对并行计算的维度有更高需求呢?答案是网格跨步,它能提供更优的并行计算效率。
[2, 4]
的执行配置为例,该执行配置中整个grid只能并行启动8个线程,假如我们要并行计算的数据是32,会发现后面8号至31号数据共计24个数据无法被计算。for
循环,每个线程可以干更多事情,所有线程的启动销毁开销更少。[1, 1]
,如下所示,那么核函数的跨步大小就成为了1,核函数里的for
循环与CPU函数中顺序执行的for
循环的逻辑一样,非常方便验证CUDA并行计算与原来的CPU函数计算逻辑是否一致。