随机内存访问和银行冲突
random memory access and bank conflict
这些天,我正在尝试在移动 gpu(adreno) 上编程
我用于图像处理的算法具有 'randomness' 内存访问。
它引用'fixed'范围内的一些像素进行过滤。
但是,我无法确切知道将引用哪个像素(取决于图像)
据我了解。如果多线程访问本地内存库
它会导致银行冲突。所以在我的情况下,它应该会引起银行冲突。
我的问题:我可以消除随机内存访问时的存储区冲突吗?
或者我可以减少它们吗?
有多种方法可以处理库冲突 - 您正在处理的元素的大小、行与行之间的跨度以及将坐标移动到不同的内存地址。它永远不会像非随机/无冲突那么好,所以你会注意到取决于图像 - 你会看到明显不同的计算时间。
参见 http://cuda-programming.blogspot.com/2013/02/bank-conflicts-in-shared-memory-in-cuda.html
假设随机访问的像素之间的距离以某种方式呈正态分布,您可以考虑将图像平铺成子图像。
我的意思是:您可以使用尺寸为 256x256 的 4x4 图像,而不是(比方说)1024x1024 图像。它们中的每一个都保存在内存中,因此 "near" 像素访问保留在同一个图像对象中。只有远距离操作需要访问不同的子图像。
第二种选择:不使用 CLImage
对象,尝试将数据保存到数组中。数组中的数据可以按Z-order曲线排序存储。这也导致空间分布减少(与行顺序排序相比)
当然,这在很大程度上取决于您的图片大小。
这些天,我正在尝试在移动 gpu(adreno) 上编程
我用于图像处理的算法具有 'randomness' 内存访问。
它引用'fixed'范围内的一些像素进行过滤。
但是,我无法确切知道将引用哪个像素(取决于图像)
据我了解。如果多线程访问本地内存库 它会导致银行冲突。所以在我的情况下,它应该会引起银行冲突。
我的问题:我可以消除随机内存访问时的存储区冲突吗?
或者我可以减少它们吗?
有多种方法可以处理库冲突 - 您正在处理的元素的大小、行与行之间的跨度以及将坐标移动到不同的内存地址。它永远不会像非随机/无冲突那么好,所以你会注意到取决于图像 - 你会看到明显不同的计算时间。
参见 http://cuda-programming.blogspot.com/2013/02/bank-conflicts-in-shared-memory-in-cuda.html
假设随机访问的像素之间的距离以某种方式呈正态分布,您可以考虑将图像平铺成子图像。
我的意思是:您可以使用尺寸为 256x256 的 4x4 图像,而不是(比方说)1024x1024 图像。它们中的每一个都保存在内存中,因此 "near" 像素访问保留在同一个图像对象中。只有远距离操作需要访问不同的子图像。
第二种选择:不使用 CLImage
对象,尝试将数据保存到数组中。数组中的数据可以按Z-order曲线排序存储。这也导致空间分布减少(与行顺序排序相比)
当然,这在很大程度上取决于您的图片大小。