我正在学习OpenCL编程并在AMD GPU上运行一些程序。我参考了AMD OpenCL编程指南,了解了关于GCN架构的全局内存优化。我无法理解银行冲突与渠道冲突之间的区别。
有人可以解释一下他们之间的区别吗? 提前致谢。
答案 0 :(得分:5)
如果两个内存访问请求被定向到同一个控制器,则硬件将访问序列化。 这称为通道冲突。这意味着,每个集成内存控制器电路一次可以用于单个任务,如果您碰巧将任意两个任务的地址映射到同一个通道,连续服务。
同样,如果两个内存访问请求转到同一个内存库,硬件会对访问进行序列化。 这称为银行冲突。如果有多个内存芯片,那么您应该避免使用硬件特殊宽度的步幅。
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
所以你不应该这样读:
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
也不是:
address 1 5 9 13
channel 1 1 1 1 // %100 channel conflict, serialized
bank 1 1 1 1 // %100 bank conflict, serialized
但这可能没问题:
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
因为步幅不是通道的倍数,也不是库宽度。
编辑:如果您的算法更多是本地存储优化的,那么您应该注意本地数据存储通道冲突。除此之外,一些卡可以使用常量内存作为独立的通道源来加速降级速率。
编辑:您可以使用多个wavefronts来隐藏基于冲突的延迟,也可以使用指令级并行。
编辑:本地数据存储通道的数量比全局通道快得多且数量众多,因此优化lds非常重要,因此在全局通道上均匀采集然后散布在本地通道上不应该是有问题的在全球渠道上的分散和本地渠道的统一收集。
对于具有不错主板的AMD APU,如果您的软件不可更改,您应该可以根据需要选择n路信道交错或n路银行交错。