Вопрос

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

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

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

__global__ void compute(long *c1, long size, ...)
{
  ...
  long d[size];
  ...
}
Это было полезно?

Решение

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

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

Другие советы

Вы можете сделать # 1, но остерегайтесь, это будет сделано в каждом потоке!

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

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

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

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

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

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

Поддерживается динамическое распределение памяти в Runtime ядра, проверяйте пример SDK, новое удаление.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top