привет, я просто хотел узнать, возможно ли сделать следующее в ядре 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, но будьте осторожны, это будет сделано в КАЖДОМ потоке!
Ваш второй фрагмент не будет работать, поскольку динамическое выделение памяти во время выполнения ядра не поддерживается.
Вы можете динамически распределять общую память при запуске ядра.
__global__ void compute(long *c1, long size, ...) { ... extern __shared__ float shared[]; ... } compute <<< dimGrid, dimBlock, sharedMemSize >>>( blah blah );
Руководство по программированию CUDA:
размер массива определяется во время запуска (см. Раздел 4.2.3).
динамическое выделение памяти во время выполнения ядра поддерживается, посмотрите пример sdk, new delete.