Tiling 优化【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills概述在 NPU 架构中内存带宽通常是性能瓶颈。合并访存Coalesced Access当一个向量指令访问连续的内存地址时硬件可以一次性高效读取数据。跨步访存Strided Access如果向量化轴在非连续维度硬件必须发起多次内存请求或进行复杂的地址重组导致带宽利用率大幅下降。计算效率在连续轴上向量化可以利用 SIMD 单元进行纯向量加法避免了在循环内频繁执行昂贵的跨 Lane 还原Reduction指令。适用条件处理多维张量3D 及以上的规约类Reduction或归一化类Normalization算子且还原轴Reduction Axis并非内存布局中的最连续轴通常为最后一维 N。优化方法优化前非连续轴向量化# 假设 M 为还原轴N 为连续轴stride_n1 # 错误在 M 上分块导致访存不连续 for m_start in range(0, dim1, BLOCK_SIZE_M): m_offsets m_start tl.arange(0, BLOCK_SIZE_M) # 访存ptr (m_offsets * stride_m) n_idx - 跨步读 vals tl.load(input_ptr m_offsets * stride_m n_idx) acc vals result tl.sum(acc) # 循环内或末尾需要还原向量优化后连续轴向量化# 正确在 N 上分块利用连续性 offsets_n n_start tl.arange(0, BLOCK_SIZE_N) acc tl.zeros((BLOCK_SIZE_N,), dtypetl.float32) for m_idx in range(0, dim1): # 访存ptr (m_idx * stride_m) offsets_n - 连续合并读取 vals tl.load(input_ptr m_idx * stride_m offsets_n) acc vals # 纯向量加法极快 # 直接处理 acc 向量后写回优化策略重置向量化轴将 BLOCK_SIZE 从还原轴转移到物理存储最连续的轴通常是 dim_last向量累加器在连续轴上维护一个累加器向量循环设计外层循环遍历还原轴标量迭代或大步长迭代内层直接进行向量加法粗粒度调度调整 Grid 配置使每个 Program 处理更连续、更大块的数据如整个 Batch提升数据局部性关键点合并访存向量化轴必须在内存最连续的维度上避免跨步访存确保tl.load的偏移量计算中向量化部分作用于stride 1的轴向量累加在连续轴上累加避免在循环内执行昂贵的还原指令【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
CANN Tiling优化指南
Tiling 优化【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills概述在 NPU 架构中内存带宽通常是性能瓶颈。合并访存Coalesced Access当一个向量指令访问连续的内存地址时硬件可以一次性高效读取数据。跨步访存Strided Access如果向量化轴在非连续维度硬件必须发起多次内存请求或进行复杂的地址重组导致带宽利用率大幅下降。计算效率在连续轴上向量化可以利用 SIMD 单元进行纯向量加法避免了在循环内频繁执行昂贵的跨 Lane 还原Reduction指令。适用条件处理多维张量3D 及以上的规约类Reduction或归一化类Normalization算子且还原轴Reduction Axis并非内存布局中的最连续轴通常为最后一维 N。优化方法优化前非连续轴向量化# 假设 M 为还原轴N 为连续轴stride_n1 # 错误在 M 上分块导致访存不连续 for m_start in range(0, dim1, BLOCK_SIZE_M): m_offsets m_start tl.arange(0, BLOCK_SIZE_M) # 访存ptr (m_offsets * stride_m) n_idx - 跨步读 vals tl.load(input_ptr m_offsets * stride_m n_idx) acc vals result tl.sum(acc) # 循环内或末尾需要还原向量优化后连续轴向量化# 正确在 N 上分块利用连续性 offsets_n n_start tl.arange(0, BLOCK_SIZE_N) acc tl.zeros((BLOCK_SIZE_N,), dtypetl.float32) for m_idx in range(0, dim1): # 访存ptr (m_idx * stride_m) offsets_n - 连续合并读取 vals tl.load(input_ptr m_idx * stride_m offsets_n) acc vals # 纯向量加法极快 # 直接处理 acc 向量后写回优化策略重置向量化轴将 BLOCK_SIZE 从还原轴转移到物理存储最连续的轴通常是 dim_last向量累加器在连续轴上维护一个累加器向量循环设计外层循环遍历还原轴标量迭代或大步长迭代内层直接进行向量加法粗粒度调度调整 Grid 配置使每个 Program 处理更连续、更大块的数据如整个 Batch提升数据局部性关键点合并访存向量化轴必须在内存最连续的维度上避免跨步访存确保tl.load的偏移量计算中向量化部分作用于stride 1的轴向量累加在连续轴上累加避免在循环内执行昂贵的还原指令【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考