2013-07-09 4 views
7

Как я правильно понимаю, для устройств с возможностью вычисления 2.x существует ограничение на 63 регистра на поток. Знаете ли вы, какой лимит регистра на поток для устройств вычислительной способности 1.3?Регистры Cuda в потоке

У меня есть большое ядро, которое я тестирую на GTX260. Я уверен, что я использую много регистров, так как ядро ​​очень сложно, и мне нужно много локальных переменных. Согласно профилю Cuda, мое использование регистра - 63 (Static Smem - 68, хотя я не уверен, что это значит, и динамический Smem равен 0), хотя я уверен, что у меня более 63 локальных переменных, поэтому я решил, что компилятор повторно использует регистры или проливает их в локальную память.

Теперь я думал, что устройства вычислительной способности 1.3 имеют более высокий предел регистров на поток, чем устройства 2.x. Мое предположение заключалось в том, что компилятор выбирал предел 63, потому что я использую блоки из 256 потоков, и в этом случае 256 * 63 равно 16128, а 256 * 64 - 16384, что является предельным числом регистров для SM этого устройства. Поэтому я предполагал, что если я уменьшу количество потоков на блок, я могу увеличить количество используемых регистров. Поэтому я запустил ядро ​​с блоками из 196 потоков. Но снова профайлер показывает 63 регистра, хотя 63 * 192 - 12096, а 64 * 192 - 12288, что является способом внутри предела 16384 SM.

Итак, любая идея, почему компилятор ограничивает себя еще 63 регистрами? Может быть, все из-за повторного использования регистра или все еще проливает регистры?

+1

Ответ может быть в первой части вашего вопроса [здесь] (http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#features-technical-specifications.xml) – talonmies

+0

Да, я смотрел на это раньше. В таблице указано «Число 32-разрядных регистров на один процессор», которое составляет 16 КБ, но мне нужно максимальное количество разрешенных регистров ** на поток **, который там не указан. Я знаю, что для устройств 2.x предел равен 63, но существует ли ограничение на 1,3? – Atirag

+2

Продолжайте искать, номер в потоке справа внизу – talonmies

ответ

13

макс регистров на нить документирована here

Это 63 для куб.см 2.x и 3.0, 128 для куб.см 1.x и 255 для куб.см 3.5

Компилятор может решить, что 63 регистров достаточно, и не используется для дополнительных регистров. Регистры могут использоваться повторно, поэтому только потому, что у вас много локальных переменных, это не обязательно означает, что регистры на поток должны быть высокими.

Мое предложение было бы использовать NVCC -maxrregcountoption указать различные ограничения, а затем использовать -Xptxas -voption, чтобы компилятор сообщит вам, сколько регистры он использует, когда он создает PTX.

+0

Большое спасибо! – Atirag

+2

Вы также можете использовать [рамки запуска] (http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#launch-bounds), чтобы иметь более точное управление регистрами на ограничение потока на для каждого ядра. –

Смежные вопросы