Создание массивов в ядре NVIDIA CUDA
Вопрос
Привет, я просто хотел знать, можно ли сделать следующее внутри ядра 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, новое удаление.