AMD 硬件上的银行冲突和通道冲突有啥区别?

Posted

技术标签:

【中文标题】AMD 硬件上的银行冲突和通道冲突有啥区别?【英文标题】:What is the difference between a bank conflict and channel conflict on AMD hardware?AMD 硬件上的银行冲突和通道冲突有什么区别? 【发布时间】:2015-10-16 05:24:07 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

类似地,如果两个内存访问请求进入同一个内存库,硬件会序列化访问。 这称为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,如果您的软件不可更改,您应该能够根据需要选择 n 路通道交错或 n 路库交错。

【讨论】:

链接页面未找到404。之所以难以理解,是因为银行、频道等基本符号。以及它们与其他部分有什么关系。

以上是关于AMD 硬件上的银行冲突和通道冲突有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

二维内核中的银行冲突

随机内存访问和银行冲突

合并与银行冲突(Cuda)

使用 Nsight 确定银行冲突和合并

故意导致 CUDA 设备上共享内存的银行冲突

为啥 Cuda/OpenCL 的全局内存中没有银行冲突?