원클릭으로
triton-ascend-memory
Ascend NPU 内存访问优化策略,包括 UB(统一缓冲区)利用、数据布局优化、合并访存和预取技巧。适用于内存带宽受限、需要优化数据搬运效率、或处理大规模数据的内核代码性能优化场景
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Ascend NPU 内存访问优化策略,包括 UB(统一缓冲区)利用、数据布局优化、合并访存和预取技巧。适用于内存带宽受限、需要优化数据搬运效率、或处理大规模数据的内核代码性能优化场景
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
AscendC direct-invoke 崩溃/挂起修复索引:Kernel timeout、hang、Segmentation Fault、aic error、buffer 死锁、plog/memcheck 调试。
AscendC direct-invoke 精度失败修复索引:输出全 0/随机值、DataCopy 对齐、EnQue/DeQue 同步、FP16/FP32 精度、Cast RoundMode、DumpTensor 分段定位。
AscendC direct-invoke 工程契约:WA 使用 kernel.py + ascendc_op/,ModelNew 调用 torch.ops.npu.*,adapter 负责复制工程、CMake 构建和 npu-arch patch。适用于 dsl=ascendc 的 autoresearch 任务。
把注册式 AscendC 算子迁移为 direct-invoke 工程的保真原则:kernel 算法和 tiling 公式不乱改,只替换注册框架胶水、入口 ABI、host launch 与 PyTorch extension。
CATLASS TileShape 与 on-chip 缓存容量约束:L1/L0A/L0B/L0C 预算公式、fp16/fp32 Pingpong 双缓冲、512B 对齐与排布对 Tile 选型的影响。调参前必读。
CATLASS Gemm 性能调优:DispatchPolicy、Tile 与分核负载均衡、Swizzle、何时用 padding/Split-K/Preload。面向 AR 修改 catlass_kernel.asc 中的类型别名。
| name | triton-ascend-memory |
| description | Ascend NPU 内存访问优化策略,包括 UB(统一缓冲区)利用、数据布局优化、合并访存和预取技巧。适用于内存带宽受限、需要优化数据搬运效率、或处理大规模数据的内核代码性能优化场景 |
| category | fundamental |
| version | 1.0.0 |
| metadata | {"backend":"ascend","dsl":"triton_ascend","hardware":"Atlas A2, Atlas A3"} |
块大小需要根据算子类型和硬件存储层级来平衡:
BLOCK_SIZE * sizeof(dtype) 需小于 UB 可用容量,同时兼顾计算并行度。过小并行度不足,过大溢出 UBm0 * k0 * sizeof(A.dtype) ≤ * KB(L0A)k0 * n0 * sizeof(B.dtype) ≤ * KB(L0B)m0 * n0 * sizeof(C.dtype) ≤ * KB(L0C)A_block_ptr = tl.make_block_ptr(
base=A_ptr, shape=(M, K), strides=(stride_am, stride_ak),
offsets=(pid_m * BLOCK_M, 0), block_shape=(BLOCK_M, BLOCK_K), order=(1, 0),
)
a = tl.load(A_block_ptr, boundary_check=(0, 1))
# 移动指针
A_block_ptr = tl.advance(A_block_ptr, (0, BLOCK_K))
非连续张量先 .contiguous() 转换,再用一维 ptr + offsets 访问:
class ModelNew(torch.nn.Module):
def forward(self, x):
if not x.is_contiguous():
x = x.contiguous()
out = torch.empty_like(x)
n = x.numel()
grid = (triton.cdiv(n, BLOCK_SIZE),)
kernel[grid](x, out, n, BLOCK_SIZE=1024)
return out
一维访问比 stride 计算效率更高,推荐优先使用。
如果 host 侧没有把非连续输入转为 .contiguous(),kernel 不能假设一维ptr + offsets 与逻辑元素顺序一致;此时必须显式传入并使用 stride,或先在 host 侧物化连续张量。
常见安全写法:
x.numel() + 一维 offsets,host 侧先对输入做 .contiguous()。stride() 传给 kernel,并按逻辑维度计算 offset。torch.empty_like() 或 torch.empty(..., device=x.device, dtype=x.dtype) 创建连续输出。.contiguous() + 一维访问