过滤图像,最佳做法

时间:2014-04-09 16:46:35

标签: cuda opencl gpgpu

我有一个输入图像"让它成为1024 * 1024像素的缓冲区,带有RGBA颜色数据"

我想为每个像素做些什么,是根据邻居过滤它,如x和y方向的[-15,15]

所以我担心的是,使用全局内存执行此操作将对每个像素执行31 * 31全局内存访问,这将是非常严重的性能瓶颈" ,我也不确定多个线程试图同时从同一个内存位置读取的行为"可能有些线程无法读取 - >垃圾数据 - >垃圾数据输出"

这个问题适用于CUDA或OpenCL,因为概念应该是相同的 我知道共享内存(每个工作组)或本地内存(每个线程)不会解决这个问题,因为我无法读取另一个线程本地内存,或者另一个组共享内存"如果我正确误解了这个概念"

1 个答案:

答案 0 :(得分:2)

共享内存是解决此问题的典型方法,尽管模板区域(31 * 31)非常大。但是,仍然可以获得数据重用利益。由于相邻像素计算仅扩展一列所需的区域,因此在32位RGBA像素的16KB共享存储器阵列中,您可以拥有足够的数据用于至少64个线程,以协作地计算单个共享内存负载中的像素值。

关于读取相同位置的多个线程的问题,不可能进行垃圾数据读取。当然,争用可能会导致性能影响,但实际上内核中有序的for循环进程,无论如何都没有线程同时读取同一位置。通过适当的数据组织,将有很好的机会从全局内存中合并读取,并且在共享内存中没有存储库冲突。

此类问题非常适合GPU,例如CUDA或OpenCL,在SO上有许多像这样的程序的例子。