Ho sperimentato con i kernel CUDA per giorni per eseguire una convoluzione 2D veloce tra un'immagine 500x500 (ma potrei anche variare le dimensioni) e un kernel 2D molto piccolo (un il kernel 2pl di laplacian, quindi è un kernel 3x3 .. troppo piccolo per avere un enorme vantaggio con tutti i thread di cuda).CUDA kernel piccolo 2d convoluzione - come farlo
Ho creato un'implementazione CPU classica (due per cicli, semplice come si penserebbe) e quindi ho iniziato a creare i kernel CUDA.
Dopo alcuni tentativi deludenti per effettuare una spira più veloce ho finito con questo codice: http://www.evl.uic.edu/sjames/cs525/final.html (vedere la sezione Shared Memory), consente fondamentalmente un thread 16x16 bloccano carico di tutto i dati convoluzione ha bisogno nella memoria condivisa e quindi esegue la convoluzione.
Niente, la CPU è ancora molto più veloce. Non ho provato l'approccio FFT perché l'SDK CUDA afferma che è efficiente con grandi dimensioni del kernel.
O se non avete letto tutto quello che ho scritto, la mia domanda è:
come posso eseguire un convoluzione 2D veloce tra una percentuale relativamente alta di immagine e un kernel molto piccolo (3x3) con CUDA?
Cosa intendi con "la CPU è ancora molto più veloce"? Stai cronometrando il programma completo inclusa la copia della memoria da e verso la GPU, o solo il tempo necessario per il lancio e il completamento del kernel? –
Per ora non ho bisogno di tempistiche, posso vedere che il programma con la CPU termina molto più velocemente :( – paulAl