2D-свертка малого ядра CUDA — как это сделать

Я экспериментировал с ядрами CUDA в течение нескольких дней, чтобы выполнить быстрое 2D свертка между изображением 500x500 (но я также мог бы изменить размеры) и очень маленьким 2D-ядром (лапласианское 2D-ядро, так что это ядро ​​​​3x3... слишком маленькое, чтобы получить огромное преимущество со всеми потоками cuda)

. Я создал классическую реализацию CPU (два цикла for, настолько просто, насколько вы могли себе представить), а затем начал создавать ядра CUDA.

После нескольких неудачных попыток выполнить более быструю свертку я пришел к такому коду: http://www.evl.uic.edu/sjames/cs525/final.html(см. раздел «Общая память»), он в основном позволяет блоку потоков 16x16 загружать все необходимые данные свертки в разделяемую память, а затем выполнять свертка.

Ничего, процессор по-прежнему намного быстрее. Я не пробовал подход FFT, потому что в CUDA SDK указано, что он эффективен при больших размерах ядра.

Независимо от того, читали ли вы все, что я написал, у меня вопрос:

как я могу выполнить быструю 2D-свертку между относительно большим изображением и очень маленьким ядром (3x3) с помощью CUDA?

13
задан paulAl 13 April 2012 в 17:25
поделиться