la creazione di array di NVIDIA CUDA kernel
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];
...
}
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.