当我在内核调用时传递网格大小和线程数时,这些值是否总是和我传递的一样完全放在gridDim和blockDim中?
而且,blockIdx和threadIdx总是会遵守这些限制吗?
换句话说,拨打
kernel<<<5, 7>>>()
总是导致在内核中
gridDim.x == 5 && blockIdx.x < gridDim.x
blockDim.x == 7 && threadIdx.x < blockDim.x
以上条件举行? (同样适用于2D和3D尺寸和索引?)
我知道这可能听起来很愚蠢,但我想知道是否允许CUDA忽略资源分配的限制,因此程序员总是需要检查。
希望它清楚,谢谢!
答案 0 :(得分:3)
是的,如果您在维度&lt;&lt;&lt;它将有5个块和每个块7个线程。 请注意,如果您在GPU的范围内操作,则效率最高。您应该使用warpsize从设备属性中读取,以获得卡的最大速度。根据需要使用大量线程,但块应该是warpize的倍数。
CUDA本身不会将您的线程/块更改为其他大小,因此您可以使用该地址。