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];
  ...
}
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top