【发布时间】:2012-04-26 02:10:13
【问题描述】:
我几天来一直在试验 CUDA 内核,以在 500x500 图像(但我也可以改变尺寸)和非常小的 2D 内核(拉普拉斯 2d 内核,因此它是 3x3 内核)之间执行快速 2D 卷积。 . 太小而无法利用所有 cuda 线程获得巨大优势)。
我创建了一个 CPU 经典实现(两个 for 循环,就像您想象的那样简单),然后我开始创建 CUDA 内核。
经过几次令人失望的尝试执行更快的卷积后,我最终得到了以下代码: http://www.evl.uic.edu/sjames/cs525/final.html(参见共享内存部分),它基本上让一个 16x16 线程块将他需要的所有卷积数据加载到共享内存中,然后执行卷积。
没什么,CPU 还是快了很多。我没有尝试 FFT 方法,因为 CUDA SDK 声明它对大内核大小有效。
无论你是否阅读了我写的所有内容,我的问题是:
如何使用 CUDA 在相对较大的图像和非常小的内核 (3x3) 之间执行快速 2D 卷积?
【问题讨论】:
-
“CPU 仍然快很多”是什么意思?您是在计时整个程序,包括将内存复制到 GPU 或从 GPU 复制内存,还是只计时内核启动和完成所需的时间?
-
我现在不需要计时,我可以看到带有 CPU 的程序完成得更快:(
标签: c++ image image-processing cuda convolution