我提前为这个问题的模糊性道歉。
背景:
我试图在OpenCL中编写一个形态学图像处理函数。我有一个__local缓冲区,我用它来存储每个像素的数据(每个像素由一个工作项表示,没有循环展开)。此外,由于我在测试的早期阶段,我只使用一个工作组(8x8像素图像,因此我可以手动验证结果)。
问题:
有时必须将来自一个,两个,三个甚至四个像素的数据添加到另一个像素缓冲区中。由于这些是同一工作组中的相邻像素,因此我确信我会导致本地内存库冲突。没关系,速度不是我的首要任务(还是!)。然而,这些银行冲突似乎正在丢弃数据甚至破坏数据。我一直非常小心,不要溢出或过度运行缓冲区。
所以,我的第一个问题是:事实上,银行冲突是否可能导致数据损坏和丢失? Opencl规范似乎表明该操作应该序列化,减慢带宽 - 但没有提到数据丢失。
我的第二个问题是:帮助! - 我该怎么办?
非常感谢任何指导 - 谢谢!
答案 0 :(得分:0)
也许nvidia白皮书Prefix Sum (Scan) with CUDA可以带你走上正轨。它是all-prefix-sums algorithm
,is a good example of a computation that seems inherently sequential, but for which there is an efficient parallel algorithm.
all-prefix-sums operation
将数字[3,4,1,2]
列表转换为其总和:[0,3,7,8]
。
我知道这篇文章是关于CUDA的,但我发现生成的内核非常相似 两种技术都使用类似的概念。
我希望,这篇论文可以帮到你。
干杯