Есть ли руководство по регистру и локальной памяти в программировании cuda?
Количество регистров ограничено в GPU, например A100. Каждый поток не может использовать более 255 регистров.
Но во время моего теста, даже не выше 255, компилятор использует локальную память вместо регистра. Есть ли более подробное руководство о том, как хранить мои данные в реестре и когда они будут в локальной памяти?
Я пытаюсь определить локальный массив в своем ядре. Похоже, массив len повлияет на действие компилятора.
template<int len>
global void test(){
// ...
float arr[len];
// ...
}
1 ответ
Локальные массивы помещаются в локальную память, если к ней не обращаются индексы констант времени компиляции.
Это описано в Руководстве по программированию, раздел 5.3.2 Параграф Локальная память. https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#device-memory-accesses
Доступ к локальной памяти происходит только для некоторых автоматических переменных, как указано в Спецификаторах пространства памяти переменных. Автоматические переменные, которые компилятор, скорее всего, поместит в локальную память:
- Массивы, для которых он не может определить, что они проиндексированы с постоянными количествами,
- Большие структуры или массивы, занимающие слишком много регистрового пространства,
- Любая переменная, если ядро использует больше регистров, чем доступно (это также называется сбросом регистров).