CUDA small kernel 2d convolution - cómo hacerlo

He estado experimentando con los núcleos CUDA durante días para realizar una rápida convolución 2D entre una imagen de 500x500 (pero también podría variar las dimensiones) y un kernel 2D muy pequeño (un kernel laplaciano 2d, por lo que es un kernel de 3x3 ... demasiado pequeño tomar una gran ventaja con todos los hilos de cuda).

Creé una implementación clásica de CPU (dos para bucles, tan fácil como podría pensar) y luego comencé a crear núcleos CUDA.

Después de algunos intentos decepcionantes de realizar una convolución más rápida, terminé con este código:http://www.evl.uic.edu/sjames/cs525/final.html (Consulte la sección Memoria compartida), básicamente, permite que un bloque de 16x16 subprocesos cargue todos los datos de convolución que necesita en la memoria compartida y luego realiza la convolución.

Nada, la CPU sigue siendo mucho más rápida. No probé el enfoque FFT porque el SDK de CUDA indica que es eficiente con grandes tamaños de kernel.

Si lees o no todo lo que escribí, mi pregunta es:

¿Cómo puedo realizar una rápida convolución 2D entre una imagen relativamente grande y un kernel muy pequeño (3x3) con CUDA?

Respuestas a la pregunta(1)

Su respuesta a la pregunta