随机内存访问和银行冲突

时间:2015-05-09 03:01:40

标签: opencl gpu shared-memory bank-conflict

在这些日子里,我正在尝试移动gpu(adreno)上的程序

我用于图像处理的算法具有内存访问的“随机性”。

它引用“固定”范围内的某些像素进行过滤。

但是,我无法准确知道将引用哪个像素(取决于图像)

据我所知,

如果多线程访问本地内存库  它会导致银行冲突。所以在我的情况下,它应该导致银行冲突。

我的问题:我可以通过随机内存访问消除银行冲突吗?

还是可以减少它们?

2 个答案:

答案 0 :(得分:0)

有多种方法可以处理银行冲突 - 您正在使用的元素的大小,行之间的跨度以及将坐标转移到不同的内存地址。它永远不会像非随机/冲突一样好,所以你会注意到的是取决于图像 - 你会看到显着不同的计算时间。

请参阅http://cuda-programming.blogspot.com/2013/02/bank-conflicts-in-shared-memory-in-cuda.html

答案 1 :(得分:0)

假设您随机访问的像素的距离以某种方式正态分布,您可以考虑将图像平铺为子图像。

我的意思是:您可能拥有尺寸为256x256的4x4图像,而不是使用(假设)1024x1024图像。它们中的每一个都在记忆中保存在一起,所以"靠近"像素访问保持在同一图像对象中。只有远距离操作需要访问不同的子图像。

第二个选项:尝试将数据保存到数组中,而不是使用CLImage个对象。数组中的数据可以存储在 Z顺序曲线排序中。这也导致空间分布减少(与行顺序排序相比)

但当然,这在很大程度上取决于您的图像尺寸。