Что касается "float vals [9]", это будет эффективно в CUDA. Для массивов небольшого размера компилятор почти наверняка выделит все элементы непосредственно в регистры. Таким образом, «vals [0]» будет регистром, «vals [1]» будет регистром и т. Д.
Если в компиляторе не хватает регистров или размер массива превышает 16, используется локальная память. Вам не нужно беспокоиться о выделении / освобождении локальной памяти, компилятор / драйвер сделает все это за вас.
Устройства с вычислительной способностью 2.0 и выше имеют стек вызовов для таких вещей, как рекурсия. Например, вы можете установить размер стека до 6 КБ на поток с помощью:
cudaStatus = cudaThreadSetLimit(cudaLimitStackSize, 1024*6);
Обычно вам не нужно трогать стек самостоятельно. Даже если вы добавите большие статические массивы в функции вашего устройства, компилятор и драйвер увидят, что там, и освободят место для вас.