He estado experimentando con 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 núcleo 2D muy pequeño (un laplacian kernel 2d, por lo que es un kernel 3x3 ... demasiado pequeño para tomar una gran ventaja con todos los hilos cuda).CUDA núcleo pequeño 2d convolución - cómo hacerlo
Creé una implementación clásica de CPU (dos loops, tan fácil como se podría pensar) y luego comencé a crear núcleos CUDA.
Después de algunos intentos decepcionantes para realizar una convolución más rápido que terminó con este código: http://www.evl.uic.edu/sjames/cs525/final.html (ver la sección de memoria compartida), que básicamente permite a los hilos 16x16 bloque de carga todos los datos de convolución que necesita en la memoria compartida y luego realiza la convolución.
Nada, la CPU es aún mucho más rápida. No probé el enfoque de FFT porque el SDK de CUDA indica que es eficiente con tamaños de kernel grandes.
Independientemente de si usted lee todo lo que escribí, mi pregunta es:
cómo puedo realizar una convolución 2D rápido entre una imagen relativamente grande y un pequeño núcleo (3x3) con CUDA?
¿Qué quiere decir con "la CPU es aún mucho más rápida"? ¿Está sincronizando el programa completo, incluida la copia de memoria hacia y desde la GPU, o simplemente el tiempo que demora el kernel en iniciarse y completarse? –
No necesito tiempo por ahora, puedo ver que el programa con la CPU termina MUCHO más rápido :( – paulAl