当前位置:首页职业培训

搞懂 CUDA Shared Memory 上的 bank conflicts 和向量化指令(LDS.128 / float4)的访存特点

作者:职业培训 时间: 2024-12-29 03:59:05 阅读:687

在优化算子如 GEMM 时,我们充分利用 shared memory 的广播功能,同时避免 bank conflicts。LDS.64 和 LDS.128 指令(比如通过 float2 和 float4)一次可以访问 8 或 16 个字节。然而,官方文档对于超过 4 字节访问的说明并不充分,这导致理解上的困扰。

shared memory 的结构是每个 32 个 banks 存储 4字节(32位)的数据,每个 bank 每个周期的带宽为 32位。这意味着单次 memory transaction 最多可取 128字节。对于每个 warp,当每个线程访问 4字节时,简单的 broadcast 和 bank conflict 机制容易处理。然而,LDS.64 和 128 的情况不同。

使用 LDS.64 时,每个线程请求 64位,导致每 16个线程需要一次 128字节的请求。CUDA 会将一个 warp 分为两个半 warp,每半 warp 一次交易。只有在满足特定条件(活跃且单个半 warp 需要的最多数据不超过 64字节)时,交易才会合并。例如,连续访问 uint2 的情况,可能需要两次交易,而符合合并条件的模式则为一次交易。

对于LDS.128,每个线程请求 128位,每 8个线程一次 128字节。CUDA 将半 warp 再细分为两个四分之一 warp。通常情况下,每个 warp 需要四次交易。只有在特定条件满足时(如活跃线程访问连续区域),四分之一 warp 的请求才会合并。

在 GEMM 优化中,合理安排 warp 内线程的 4 * 8 或 8 * 4 顺序和 Z-Order 排列,可以有效利用 bank conflict 的合并机制,减少 memory transaction,提高性能。对于简单的 kernel,额外的交易可能影响不大,但在 GPU 流水线运行时,交易次数的差异会更明显。

标签:

本文地址: http://www.goggeous.com/20241228/1/973516

文章来源:天狐定制

版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。

猜你喜欢
猜你喜欢
  • 最新动态
  • 热点阅读
  • 猜你喜欢
热门标签

网站首页 ·

本站转载作品版权归原作者及来源网站所有,原创内容作品版权归作者所有,任何内容转载、商业用途等均须联系原作者并注明来源。

鲁ICP备2024081150号-3 相关侵权、举报、投诉及建议等,请发E-mail:admin@qq.com