1

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

而且,blockIdx 和 threadIdx 会始终遵守这些限制吗?

换句话说,调用

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

总是导致在内核中,

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

满足以上条件?(同样具有 2D 和 3D 尺寸和索引?)

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

希望清楚,谢谢!

4

1 回答 1

3

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

CUDA 本身不会将您的线程/块更改为其他大小,因此您应该对寻址没问题。

于 2012-09-26T07:38:36.100 回答