【问题标题】:Design of convolution kernel CUDA卷积核CUDA的设计
【发布时间】:2017-12-11 20:15:37
【问题描述】:

我正在尝试为 CUDA 设计卷积核代码。它将拍摄相对较小的图片(对于我的应用程序通常是 19 * 19 的图片)

在我的研究中,我发现最值得注意的是这篇论文:https://www.evl.uic.edu/sjames/cs525/final.html

我理解它的概念,但我想知道,对于小图像,使用 原始图像的逐个像素块,并使用该块的线程作为要获取的像素,然后进行块宽缩减,足够快吗?我做了一个基本的实现,使全局内存访问合并,那么,它是小图片的好设计吗?还是我应该遵循“传统”的方法?

【问题讨论】:

  • 内核有多大?
  • 内核为 15 * 15 或 31 * 31 个细胞。我将它们填充到 2 的幂,这就是我试图使全局内存访问合并
  • 它看起来足够小,您可以将内核和映像加载到共享内存中,并留出空间。
  • 这是我采用的方法,对不可分割的图像尺寸进行了一些调整(例如 9 * 9,内核半径 = 8,您需要加载 (9 + 2 * 8)² px 的图片,或 25²,因此您需要在线程之间进行划分(也许我应该使用“虚拟”扭曲,以便每个线程加载 1 个像素?)

标签: algorithm cuda gpgpu


【解决方案1】:

这一切都取决于您最终申请的程序。正如您所提到的,如果您打算只对几张“相对较小的图片”进行卷积,那么一种天真的方法就足够了。事实上,如果您不处理大量数据,由于 CPU 和 GPU 之间的内存传输开销,串行方法甚至可能更快。正如您所提到的,我建议首先编写访问全局内存的内核,如果您将来要使用更大的数据集,那么尝试“传统”方法也是有意义的,并比较运行时。

【讨论】:

  • 谢谢,指导我。我虽然采用这种方法,但希望批准这种方法。深深感谢
  • 最后,发生合并冲突的事件,我的尝试实现真的很慢,除了巨大的 > 32 * 32 内核,这使得它有点不可用,时间缩放显然 (n / 1024) ² 或 3.... 我留下此评论作为对其他人的警告:这个概念不起作用,即使对于较小的图像,论文也有更好的解决方案
猜你喜欢
  • 1970-01-01
  • 2012-04-26
  • 2018-05-03
  • 2018-06-15
  • 2016-11-01
  • 2012-03-06
  • 2021-12-02
  • 1970-01-01
  • 2012-10-21
相关资源
最近更新 更多