过滤图像,最佳做法

问题描述 投票:0回答:1

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

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

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

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

cuda opencl gpgpu
1个回答
2
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.