CUDA gridDim,blockDim总是用户定义的



当我在内核调用时传递网格大小和线程计数时,这些值会始终完全按照我传递它们的方式放置在 gridDim 和 blockDim 中吗?

此外,blockIdx 和 threadIdx 会始终遵守这些限制吗?

换句话说,调用

kernel<<<5, 7>>>()

总是导致在内核中拥有,

gridDim.x == 5 && blockIdx.x < gridDim.x
blockDim.x == 7 && threadIdx.x < blockDim.x

以上条件要成立?(同样与 2D 和 3D 大小和索引相同?

我知道这听起来可能很愚蠢,但我想知道是否允许 CUDA 忽略资源分配的此限制,因此程序员总是需要检查。

希望清楚,谢谢!

是的,如果你在维度 <<<5,7>>> 中启动内核,它将有 5 个块,每个块 7 个线程。请注意,如果您在 GPU 的范围内操作,则效率最高。您应该使用从设备属性中读取的 warpsize 来获得卡的最大速度。根据需要使用大量线程,但块应该是扭曲大小的倍数。

CUDA 本身不会将您的线程/块更改为另一种大小,因此您应该可以接受寻址。

最新更新