AMD 硬件上的库冲突和通道冲突有什么区别?

What is the difference between a bank conflict and channel conflict on AMD hardware?

我正在学习 OpenCL 编程和 运行 AMD GPU 上的一些程序。我参考了 AMD OpenCL 编程指南来阅读有关 GCN 架构的全局内存优化。我无法理解银行冲突和渠道冲突之间的区别。

有人可以解释一下它们之间的区别吗? 提前致谢。

如果两个内存访问请求指向同一个控制器,硬件会序列化访问。 这称为通道冲突。这意味着,如果您碰巧将任何两个任务的地址映射到同一个访问,则每个集成内存控制器电路一次只能为一个任务服务频道,它们是连续提供的。

类似地,如果两个内存访问请求到达同一个内存组,硬件会序列化访问。 这叫做bank冲突。如果有多个内存芯片,那么你应该避免使用硬件特殊宽度的stride。

具有 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

因为步幅不是通道宽度或坡度宽度的倍数。

编辑: 如果您的算法更多地是针对本地存储优化的,那么您应该注意本地数据存储通道冲突。除此之外,有些卡可以使用常量内存作为独立的通道源来加快读取速度。

编辑:您可以使用多个波前来隐藏基于冲突的延迟,或者您也可以使用指令级并行。

编辑: 本地数据存储通道的数量比全局通道快得多,数量也更多,因此针对 LDS(本地数据共享)进行优化非常重要,因此在全局上统一收集然后分散在本地频道上的频道应该不会像在全球频道上分散和在本地频道上统一收集一样有问题。

http://developer.amd.com/tools-and-sdks/opencl-zone/amd-accelerated-parallel-processing-app-sdk/opencl-optimization-guide/#50401334_pgfId-472173

对于具有不错主板的 AMD APU,如果您的软件不可更改,您应该能够 select 根据您的需要进行 n 路通道交错或 n 路组交错。