快速的2D卷积实现?

3
我已经为2D卷积制作了一个CUDA程序,现在想将其与一些非CUDA实现进行比较,以衡量加速效果。
我可以将其与使用传统的多重循环方法或matlab的conv2的纯C自己实现进行比较,但这并不像是一个合法/公平的比较,因为它们不是最快的实现方式。
此外,我正在考虑尝试OpenCV,并且一直在寻找SIMD优化版本,但没有成功。有什么建议吗?我应该选择OpenCV吗?
注意:我已阅读其他问题,包括这个,但答案基本上与我的纯C代码或讨论可用的各种方法相同。
1个回答

5

最快的通用2D卷积算法将首先在源上执行FFT,然后进行相关计算,然后再次FFT以获得结果(这就是matlab中conv2所做的),因此您的多重循环方法可能不是最佳选择。

如果您想使用,GSL会为您提供标准且快速的FFT实现。

此外,如果内核是可分离的,则可以将卷积视为两个1D卷积。

如果OpenCV也适用,则非常好,它应该被广泛接受为快速实现。


太好了!我之前不知道GSL,尝试它的FFT实现听起来是个好主意。我认为,如果我将我的程序与OpenCV和GSL两者进行比较测试,因为我还测试过Matlab,所以我会得到一个相当好的比较结果。感谢你的帮助Pace! - kirbuchi
根据内核大小,FFT并不总是有利的(想象一下1x1内核,显然FFT/iFFT是一个很大的开销)。此外,我完全同意,但我更愿意推荐FFTW库用于FFT。这是MATLAB使用的库,也是最广泛使用的非供应商库(我认为),而且它应该也是限制性GNU GPL许可证;) - zerm
如果有人感兴趣,我找到了一个非常快的实现。它使用IPP,所以只能在英特尔处理器上运行,但也许可以帮助某些人。(http://www.matthewzeiler.com/software/) - kirbuchi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接