Есть ли руководство по регистру и локальной памяти в программировании 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

Доступ к локальной памяти происходит только для некоторых автоматических переменных, как указано в Спецификаторах пространства памяти переменных. Автоматические переменные, которые компилятор, скорее всего, поместит в локальную память:

  • Массивы, для которых он не может определить, что они проиндексированы с постоянными количествами,
  • Большие структуры или массивы, занимающие слишком много регистрового пространства,
  • Любая переменная, если ядро ​​использует больше регистров, чем доступно (это также называется сбросом регистров).
Другие вопросы по тегам