создание массивов в ядре nvidia cuda - PullRequest
10 голосов
/ 02 февраля 2010

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

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

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

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

Ответы [ 4 ]

10 голосов
/ 03 февраля 2010

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

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

9 голосов
/ 10 февраля 2010

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

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

6 голосов
/ 09 февраля 2010

Вы можете динамически распределять общую память при запуске ядра.

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

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

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

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

5 голосов
/ 29 апреля 2012

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

...