Ответ 1
Распределение регистров в PTX совершенно не имеет отношения к конечному потреблению ядра. PTX является лишь промежуточным представлением конечного машинного кода и использует статическую единую форму назначения, что означает, что каждый регистр в PTX используется только один раз. Часть PTX с сотнями регистров может скомпилироваться в ядро с несколькими регистрами.
Назначение регистров выполняется с помощью ptxas
как полностью автономный прогон компиляции (как статически, так и точно вовремя драйвером, либо и то, и другое), и он может выполнять много переупорядочения кода и оптимизации на входном PTX для улучшения пропускная способность и сохранение регистров, что означает, что между переменными исходного C или регистрами в PTX и окончательным количеством регистров собранного ядра существует незначительная или вообще отсутствует связь.
nvcc
предоставляет некоторые способы влияния на поведение распределения регистров ассемблера. У вас есть __launch_bounds__
, чтобы предоставить эвристические подсказки компилятору, который может влиять на распределение регистров, а компилятор/ассемблер принимает аргумент -maxrregcount
(при потенциальном расходе переноса регистров в локальную память, что может снизить производительность). Ключевое слово volatile используется, чтобы иметь значение для более старых версий компилятора на основе nvopen64 и может влиять на поведение разлива локальной памяти. Но вы не можете произвольно контролировать или управлять распределением регистров в исходном коде кода C или в языке сборки PTX.