Создание массивов в ядре nvidia cuda

привет, я просто хотел знать, возможно ли сделать следующее внутри ядра nvidia cuda

__global__ void compute(long *c1, long size, ...)
{
  ...
  long d[1000];
  ...
}

или следующее

__global__ void compute(long *c1, long size, ...)
{
  ...
  long d[size];
  ...
}

Ответ 1

Вы можете сделать первый пример, я не пробовал второй.

Однако, если вы можете помочь, вы можете захотеть перепроектировать вашу программу, чтобы это не сделать. Вы не хотите выделять 4000 байт памяти в ядре. Это приведет к большому использованию локальной памяти CUDA, поскольку вы не сможете вместить все в регистры. Локальная память CUDA медленная (400 циклов задержки памяти).

Ответ 2

Вы можете сделать # 1, но будьте осторожны, это будет сделано в КАЖДОЙ теме!

Второй фрагмент не будет работать, поскольку динамическое распределение памяти во время выполнения ядра не поддерживается.

Ответ 3

Динамическое распределение общей памяти при запуске ядра.

__global__ void compute(long *c1, long size, ...)
 {
  ...
   extern __shared__ float shared[];
  ...
 }

compute <<< dimGrid, dimBlock, sharedMemSize >>>( blah blah );

Руководство по программированию CUDA:

размер массива определяется во время запуска (см. раздел 4.2.3).

Ответ 4

поддерживается динамическое распределение памяти во время выполнения ядра, проверьте пример sdk, новое удаление.