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 игнорировать эти ограничения для распределения ресурсов, и поэтому программист всегда должен проверять.

Надеюсь, это понятно, спасибо!

1

Решение

Да, если вы запустите свое ядро ​​в измерении <<<5,7 >>> у него будет 5 блоков и 7 потоков на блок.
Обратите внимание, что вы наиболее эффективны, если вы работаете в рамках вашего GPU. Вы должны использовать размер деформации, считанный из свойств устройства, чтобы получить максимальную скорость от вашей карты. При необходимости используйте много потоков, но блоки должны быть кратны размеру основы.

CUDA сама по себе не меняет ваши потоки / блоки на другой размер, поэтому вы должны быть в порядке с адресацией.

3

Другие решения

Других решений пока нет …