我正在学习OpenCL编程并在AMD GPU上运行一些程序.我参考了AMD OpenCL编程指南,了解了关于GCN架构的全局内存优化.我无法理解Bank冲突和Channel冲突之间的区别.
有人可以解释一下他们之间的区别吗?提前致谢.
如果两个内存访问请求被定向到同一个控制器,则硬件将访问序列化.这称为渠道冲突. 这意味着,每个集成的存储器控制器电路一次可以用于单个任务,如果您碰巧将任意两个任务的地址映射到相同的通道,则它们是串行服务的.
类似地,如果两个存储器访问请求进入同一存储体,则硬件将访问序列化.这被称为银行冲突.如果有多个内存芯片,那么你应该避免使用硬件特殊宽度的步幅.
4个通道和2个存储区的示例:(不是现实世界的例子,因为存储区必须大于或等于通道)
address 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
channel 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1
bank 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1
Run Code Online (Sandbox Code Playgroud)
所以你不应该这样读:
address 1 3 5 7 9
channel 1 3 1 3 1 // %50 channel conflict
bank 1 1 1 1 1 //%100 bank conflict,serialized on bank level
Run Code Online (Sandbox Code Playgroud)
也不是这样
address 1 5 9 13
channel 1 1 1 1 // %100 channel conflict, serialized
bank 1 1 1 1 // %100 bank conflict, serialized
Run Code Online (Sandbox Code Playgroud)
但这可能没问题:
address 1 6 11 16
channel 1 2 3 4 // no conflict, %100 channel usage
bank 1 2 1 2 // no conflict, %100 bank usage
Run Code Online (Sandbox Code Playgroud)
因为步幅不是通道和银行宽度的倍数.
编辑:如果您的算法更多是本地存储优化,那么您应该注意本地数据存储通道冲突.除此之外,一些卡可以使用常量内存作为独立的通道源来加速降级速率.
编辑:您可以使用多个波前来隐藏基于冲突的延迟,也可以使用指令级并行.
编辑:本地数据存储通道的数量比全局通道快得多且数量众多,因此优化lds非常重要,因此在全局通道上均匀收集然后在本地通道上散射不应该像在全局通道上散布和均匀收集那样成问题当地渠道.
对于具有合适主板的AMD APU,如果您的软件不可更改,您应该能够根据需要选择n路信道交错或n路银行交错.