Максимальное количество потоков, которые могут быть инициированы в одном ядре CUDA

Меня смущает максимальное количество потоков, которое можно запустить в графическом процессоре Fermi.

Мой запрос устройства GTX 570 говорит следующее.

  Maximum number of threads per block:           1024
  Maximum sizes of each dimension of a block:    1024 x 1024 x 64
  Maximum sizes of each dimension of a grid:     65535 x 65535 x 65535

Из моего понимания я понимаю вышеприведенное утверждение как:

Для ядра CUDA мы можем запустить максимум 65536 блоков. Каждый запущенный блок может содержать до 1024 потоков. Следовательно, в принципе, я могу запустить до 65536*1024 (=67108864) потоков.

Это правильно? Что если мой поток использует много регистров? Сможем ли мы достичь этого теоретического максимума числа потоков?

После того, как я написал и запустил ядро ​​CUDA, как мне узнать, что количество запущенных мной потоков и блоков действительно было создано. Я имею в виду, что я не хочу, чтобы графический процессор вычислял какой-то мусор или вел себя странно, если я случайно создал больше потоков, чем это возможно для этого конкретного ядра.

1 ответ

Решение

Для ядра CUDA мы можем запустить максимум 65536 блоков. Каждый запущенный блок может содержать до 1024 потоков. Следовательно, в принципе, я могу запустить до 65536*1024 (=67108864) потоков.

Нет, это не правильно. Вы можете запустить сетку до 65535 x 65535 x 65535 блоков, и каждый блок имеет максимум 1024 потоков на блок, хотя ограничение ресурсов на каждый поток может ограничить общее количество потоков в блоке меньше этого максимума.

Что если мой поток использует много регистров? Сможем ли мы достичь этого теоретического максимума числа потоков?

Нет, в этом случае вы не сможете достичь максимального количества потоков на блок. Каждый выпуск инструментария NVIDIA CUDA включает электронную таблицу калькулятора занятости, которую можно использовать, чтобы увидеть влияние давления регистра на размер ограничивающего блока.

Кроме того, после написания и запуска ядра CUDA, как мне узнать, что количество запущенных мной потоков и блоков действительно было создано? Я имею в виду, что я не хочу, чтобы графический процессор вычислял какой-то мусор или вел себя странно, если я случайно создал больше потоков, чем это возможно для этого конкретного ядра.

Если вы выберете недопустимую конфигурацию выполнения (поэтому неправильный размер блока или размер сетки), ядро ​​не запустится, и среда выполнения выдаст cudaErrorInvalidConfiguration сообщение об ошибке. Вы можете использовать стандарт cudaPeekAtLastError() а также cudaGetLastError() проверить состояние любого запуска ядра.

Другие вопросы по тегам