在优化算子如 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
文章来源:天狐定制
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
2024-12-29职业培训
2024-12-29职业培训
2024-12-29职业培训
2024-12-29职业培训
2024-12-29职业培训
2024-12-29职业培训
2024-12-29职业培训
2024-12-29职业培训
2024-12-29职业培训
2024-12-29职业培训
2024-12-28 13:40:35职业培训
2024-12-28 13:40:34职业培训
2024-12-28 13:40:34职业培训
2024-12-28 13:40:33职业培训
2024-12-28 13:40:33职业培训
2024-12-28 13:40:31职业培训
2024-12-28 13:40:29职业培训
2024-12-28 13:40:24职业培训
2024-12-28 13:40:23职业培训
2024-12-28 13:40:22职业培训
2024-12-14 00:04职业培训
2024-12-04 07:46职业培训
2024-12-17 12:35职业培训
2024-12-17 15:38职业培训
2024-12-10 03:42职业培训
2024-12-02 00:03职业培训
2024-12-18 18:40职业培训
2024-11-29 19:47职业培训
2024-12-11 02:06职业培训
2024-11-27 15:02职业培训
扫码二维码
获取最新动态