Domanda

Ciao Volevo solo sapere se è possibile effettuare le seguenti operazioni all'interno del kernel NVIDIA CUDA

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

o il seguente

__global__ void compute(long *c1, long size, ...)
{
  ...
  long d[size];
  ...
}
È stato utile?

Soluzione

Si può fare il primo esempio, non ho provato la seconda.

Tuttavia, se si può farne a meno, si potrebbe desiderare di ridisegnare il vostro programma non per fare questo. Non si vuole allocare 4000 byte di memoria nel kernel. Che porterà ad un sacco di utilizzo della memoria locale CUDA, dal momento che non sarà in grado di rientrare tutto nei registri. memoria locale CUDA è lento (400 cicli di latenza di memoria).

Altri suggerimenti

Si può fare 1 #, ma attenzione questo sarà fatto in filo OGNI!

Il secondo frammento non funzionerà, perché allocazione dinamica della memoria in fase di esecuzione del kernel non è supportato.

È possibile allocare memoria condivisa dinamicamente quando si avvia il kernel.

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

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

CUDA guida di programmazione:

  

la dimensione della matrice è determinata al momento del lancio (vedi paragrafo 4.2.3).

allocazione dinamica della memoria in fase di esecuzione del kernel è supportato, controllare l'esempio sdk, nuova eliminazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top