CUDA中Shared Memory的Bank Conflict
1. 核心概念引入 (What Why)笔记的开头需要明确 Shared Memory 的物理结构这是理解冲突的前提。Shared Memory 的组织方式CUDA 的共享内存被划分为 32 个大小相等的内存块称为Banks存储体。Bank 的宽度每个 Bank 的宽度通常是 4 字节32-bit或 8 字节64-bit具体取决于架构配置。Warp 与并行访问GPU 执行的基本单位是 Warp包含 32 个线程。这 32 个线程在同一时刻发起内存访问请求。理想情况下如果这 32 个线程分别访问 32 个不同的 Bank内存可以同时处理这 32 个请求实现最大带宽。2. 定义 Bank Conflict (The Problem)触发条件当同一个 Warp 中的多个线程试图访问同一个 Bank中的不同地址时就会发生 Bank Conflict。后果硬件无法并行处理这些请求只能将它们序列化串行处理。如果有 N 个线程访问同一个 Bank这就是 N-way Conflict N 路冲突内存访问时间将增加 N 倍。例外Broadcast 机制如果 Warp 中的多个线程访问的是同一个 Bank 中的完全相同的地址硬件会触发广播机制Broadcast此时不会发生冲突。3. 举例如果数据读取共享内存的第一列Stride 1线程 0 访问 Bank 0线程 1 访问 Bank 1... 完美错开无冲突。Stride 2线程 0 访问 Bank 0线程 1 访问 Bank 2... 线程 16 又绕回访问 Bank 0。此时产生 2-way conflict。Stride 32所有 32 个线程都访问 Bank 0 的不同行产生极其严重的 32-way conflict。4. 解决方案 (How to Solve)内存填充 (Memory Padding)改变分配的数组维度大小。原分配32*32当读取第一列时全部为bank0导致Bank Conflict[bank 0, bank 1, bank 2, ..., bank 31][bank 0, bank 1, bank 2, ..., bank 31][bank 0, bank 1, bank 2, ..., bank 31]...[bank 0, bank 1, bank 2, ..., bank 31]填充为32*33当读取第一列时数据就在不同的Bank。[bank 0, bank 1, bank 2, ..., bank 31, bank0][bank 1, bank 2, bank 3, ..., bank 0, bank1][bank 2, bank 3, bank 4, ..., bank 1, bank2]...[bank 31, bank 0, bank 1, ..., bank 30, bank 31]结论定义列宽尽量为奇数能够避免按列访问时的 Bank Conflict。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2492660.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!