我已经尝试了几天使用CUDA内核进行快速的二维卷积,针对一个500x500的图像(但我也可以改变其大小)和一个非常小的二维kernel(拉普拉斯2D kernel,因此是一个3x3的kernel..太小,以至于所有cuda线程都无法大幅度提高效率)。
我创建了一个CPU传统实现(两个for循环,就像您想的那样容易),然后开始创建CUDA内核。
在尝试了几次无果之后,我最终找到了这段代码:http://www.evl.uic.edu/sjames/cs525/final.html (请查看共享内存部分),它基本上让一个16x16的线程块将他所需的所有卷积数据加载到共享内存中,然后执行卷积。
然而,CPU仍然要快得多。我没有尝试FFT方法,因为CUDA SDK指出它仅适用于大内核大小的情况。
无论您是否读完我写的所有内容,我的问题是:
如何使用CUDA对相对较大的图像和非常小的kernel(3x3)进行快速的二维卷积?