Criando matrizes no kernel Nvidia Cuda
Pergunta
oi eu só queria saber se é possível fazer o seguinte dentro do kernel nvidia cuda
__global__ void compute(long *c1, long size, ...)
{
...
long d[1000];
...
}
ou o seguinte
__global__ void compute(long *c1, long size, ...)
{
...
long d[size];
...
}
Solução
Você pode fazer o primeiro exemplo, eu não tentei o segundo.
No entanto, se você puder ajudá -lo, poderá redesenhar seu programa para não fazer isso. Você não deseja alocar 4000 bytes de memória em seu kernel. Isso levará a muito uso da memória local do CUDA, pois você não poderá encaixar tudo nos registros. A memória local do CUDA é lenta (400 ciclos de latência de memória).
Outras dicas
Você pode fazer o número 1, mas cuidado, isso será feito em todos os threads!
Seu segundo snippet não funcionará, porque a alocação de memória dinâmica no Kernel Runtime não é suportada.
Você pode alocar a memória compartilhada dinamicamente quando inicia o kernel.
__global__ void compute(long *c1, long size, ...)
{
...
extern __shared__ float shared[];
...
}
compute <<< dimGrid, dimBlock, sharedMemSize >>>( blah blah );
Guia de programação CUDA:
O tamanho da matriz é determinado no horário de lançamento (consulte a Seção 4.2.3).
A alocação de memória dinâmica no Kernel Runtime é suportada, verifique o exemplo do SDK, novo delete.