Я экспериментировал с ядрами CUDA в течение нескольких дней, чтобы выполнить быструю двумерную свертку между изображением 500x500 (но я также мог изменять размеры) и очень маленькое 2D-ядро (ядро лапласиана 2d, поэтому это ядро 3x3. слишком мал, чтобы получить огромное преимущество во всех потоках cuda).
Я создал классическую реализацию CPU (два для циклов, так же легко, как вы думаете), а затем я начал создавать ядра CUDA.
После нескольких неутешительных попыток выполнить более быструю свертку я закончил с этим кодом: http://www.evl.uic.edu/sjames/cs525/final.html (см. раздел "Общая память" ), он в основном позволяет блоку потоков 16x16 загружать все данные свертки, которые ему нужны в общей памяти, а затем выполняет свертку.
Ничего, процессор все еще намного быстрее. Я не пытался использовать метод FFT, потому что CUDA SDK утверждает, что он эффективен при больших размерах ядра.
Независимо от того, читаете ли вы все, что я написал, мой вопрос:
как я могу выполнить быструю двумерную свертку между относительно большим изображением и очень маленьким ядром (3x3) с CUDA?