Convolução CUDA de kernel pequeno 2d - como fazer

Eu tenho experimentado com kernels CUDA por dias para realizar uma rápida convolução 2D entre uma imagem de 500x500 (mas eu também poderia variar as dimensões) e um kernel 2D muito pequeno (um kernel 2d laplaciano, então é um kernel 3x3 .. muito pequeno para tirar uma vantagem enorme com todos os segmentos cuda).

Eu criei uma implementação clássica da CPU (dois loops foros, tão fácil quanto você imagina) e então comecei a criar kernels CUDA.

Depois de algumas tentativas frustrantes de realizar uma convolução mais rápida, acabei com este código:http://www.evl.uic.edu/sjames/cs525/final.html (veja a seção Memória Compartilhada), basicamente permite que um bloco de threads 16x16 carregue todos os dados de convolução necessários na memória compartilhada e, em seguida, execute a convolução.

Nada, a CPU ainda é muito mais rápida. Eu não tentei a abordagem FFT porque o SDK CUDA afirma que é eficiente com grandes tamanhos de kernel.

Se você leu ou não tudo o que escrevi, minha pergunta é:

Como posso executar uma rápida convolução 2D entre uma imagem relativamente grande e um kernel muito pequeno (3x3) com CUDA?

questionAnswers(1)

yourAnswerToTheQuestion