本地内存中的 RGBA 数据布局,可减少存储库冲突

Posted

技术标签:

【中文标题】本地内存中的 RGBA 数据布局,可减少存储库冲突【英文标题】:RGBA data layout in local memory that reduces bank conflict 【发布时间】:2014-09-28 11:10:38 【问题描述】:

在本地内存中进行布局以减少银行冲突的最佳方式是什么?

我在想:

RRRRRRRRRRRR...
GGGGGGGGGGGG...
BBBBBBBBBBBB...
AAAAAAAAAAAA...

我想一次抓取所有四个通道以用于向量运算。

谢谢!

【问题讨论】:

【参考方案1】:

然后使用“RGBARGBARGBARGBA...”,您可以一次抓取所有四个通道以在矢量中使用。另外,它是 1 次读取而不是 4 次。

当多个工作项访问彼此有一定偏移的不同区域时,会导致银行冲突。因此,当涉及到导致银行冲突时,您的图像布局并不像您的行间距那么重要。

【讨论】:

谢谢。假设每个通道是一个 32 位浮点数,LDS 中有 16 个 bank。每个工作项需要访问两个相邻的像素。所以,workitem 0 访问 buf[0] 和 buf[1],workitem 1 访问 buf[1] 和 buf[2] 等等。所以肯定会有银行冲突。我只是想尽量减少它。如果我使用 RGBA 格式,那么冲突可能会更严重,因为冲突影响了四个通道,而不是一个。这就是为什么我在考虑原始问题中提到的平面配置。你怎么看? 抱歉,我不是银行冲突方面的专家。见***.com/questions/3841877/…。我的猜测是,一旦您读取的每个工作项超过 32 位,读取就会在整个工作组中序列化(一次 256 位),并且您不会发生银行冲突。 是的,好点。就 SIMT 执行而言,我花了一些时间思考。我计划使用 vload4 命令一次性加载所有像素通道。但我认为在这种情况下应该仍然没有银行冲突。 谢谢。在 AMD HD7700 上运行具有这种架构的简单内核看起来很有希望。再次感谢您的帮助。【参考方案2】:

在我的目标架构 HD7700 上,平面配置提供了最佳性能:vload4 慢得多。我认为这一定是由于银行冲突,但我不确定。

【讨论】:

以上是关于本地内存中的 RGBA 数据布局,可减少存储库冲突的主要内容,如果未能解决你的问题,请参考以下文章

减少共享内存库冲突

2.x 设备中的存储库冲突

使用交错寻址方法并行减少存储冲突

sh 获取本地存储库中冲突文件的列表

CUDA 内存库冲突

将 2 个 git 存储库与冲突结合在一起后,我希望 Powershell 中的 git mergetool 始终为每个文件选择(m)修改