已关闭
【社区任务】aclsparseSpMM(950) P-01 kernel 约180μs,如何对齐 A100 87μs 口径 #163
Jessicaruan创建于  8月18日关闭于  18 天前
Jessicaruan
8月18日 创建

【任务】8月社区任务 - aclsparseSpMM 算子开发(950)
【代码仓】https://gitcode.com/gcw_DmEcQNNx/ops-sparse 分支 feat/spmm-950-c64
【设计文档】https://gitcode.com/cann/cann-ops-competitions/pull/1073

【已完成】

  1. C++ UT:FP32/FP16/INT8/C64 PASS
  2. 官方 200 条精度(fp32×100 + complex64×100)ALL_PASS
  3. torch.sparse.addmm / aten::_sparse_addmm 走 aclsparseSpMM,无 CPU fallback
  4. Profiler 仅出现 spmm_custom_fp32

【问题】
P-01:2708×2708×1433,nnz=10556,fp32,alpha=1,beta=0,Row-major。
任务书 A100 NCU kernel_total = 87.040 μs,目标 ≥1.0×。

当前 950PR:

  • Event median ≈ 180 μs
  • torch_npu.profiler kernel_total_us ≈ 180 μs(warmup 10 / active 30)
  • kernel_ratio_vs_gpu ≈ 0.48

请确认:

  1. 验收主口径是否就是一次 torch.sparse.addmm 内全部 NPU kernel 之和的中位数,对比 87.040 μs?
  2. 现有 arch35 SIMT(AIV + asc_vf_call)是否预期能达到 ≥1.0× A100;P-01 宽 N、低 nnz 是否需要 Cube/Vector 融合或官方推荐 tiling?
  3. 若当前 kernel 已是唯一设备 kernel,是否还存在未计入的 preprocess / 描述符开销需要排除?

【已排除】

  • vector DataCopy 全路径:精度失败且更慢
  • 行串行扫 N:精度 OK,kernel 回退到 ~840 μs
    当前保留 (row, colTile) SIMT 基线。
likedislike
Jessicaruan
8月18日 评论:
likedislike
Zzhuzhiming成员
8月18日 将 rueenov11 设为负责人
zhuzhiming成员
8月18日 评论:

@ rueenov11 看下是否测试方法有误。 库上现有950 SPMM 之前测试能达到1.0x A100。

likedislike
HKFLYE
HKFLYE成员
21 天前 评论:

@gcw_DmEcQNNx
感谢反馈。
已上库版本此前按整体平均性能比进行验收,整体平均性能比超过 1.0,满足当时的整体验收口径。历史结果中仍存在部分性能未通过的 case,尤其需要关注宽 N、低 nnz 场景。附件中为之前验收的结果。
c2fe0e6c047f4098b86513e3ef74919e.csv
验收主口径确认为一次 torch.sparse.addmm 内全部 NPU kernel 之和的中位数。
P-01 宽 N、低 nnz 场景是否需要 Cube/Vector 融合或调整 tiling,应以实际 profiling 结果为依据:请先补充行 nnz 分布、N/tile 切分、实际活跃核数和访存指标。
请针对性能未通过的 case 补充以下信息:

  • 每行 nnz 的分布:min/P50/P90/P99/max、零行数,以及直方图或离散程度;
  • N 与 tile 的切分方式:N/tile、行 tile、总 tile 数,以及各 tile 的实际工作量;
  • 实际启动核数、活跃核数、每核处理的行数或 nnz,避免仅提供理论核数;
  • profiler 时间线:预热和重复次数、各 kernel 时长、预处理/格式转换耗时、主 kernel 时间占比,以及带宽和核利用率指标。
    上述信息可用于区分是 tile 数不足或负载不均导致的并行度问题,还是数据访问效率不足导致的访存瓶颈,并据此确定后续优化方向。
likedislike
Jessicaruan
20 天前 评论:

感谢确认验收主口径为一次 torch.sparse.addmm 内全部 NPU kernel 之和的中位数。

本帖 2026-08-18 所述 P-01 ~0.48×(~180μs)为早期 SIMT 基线;当前冻结 tip 50571b9 上已按 #166 口径复测通过:

【P-01 真 Cora · #166】PyG Planetoid Cora(2708×2708,nnz=10556;无额外 self-loop/对称化;coalesce;row-asc;I32 base0)

  • 环境:Ascend 950PR hidevlab,Release build,CANN 9.1.0,torch 2.10.0+cpu / torch_npu 2.10.0.post4
  • 命令:python3 -u python/ops_sparse/p01_bench.py --profile --input cora
  • Profiler:warmup=10 / active=30;op_statistic.csv 仅 spmm_custom_fp32(AI_VECTOR_CORE,Count=30)
  • kernel_total_us=35.033,GPU 基准 87.040μs,kernel_ratio_vs_gpu=2.485(≥2.0×)
  • 分列报告:https://docs.qq.com/doc/DV2hqbWFueFp4aU1E
  • #166 已关闭

【与官方口径对齐说明】

  • 单次 addmm 设备侧仅见 spmm_custom_fp32 主 kernel(无额外 preprocess/format 设备 kernel 计入同次调用)
  • p01_bench 已补充输出 all_npu_kernels_sum_median_us 与 event median 对照(feat/spmm-950-c64)

【未过 case】官方 fp32 12/25 未达、P-02/P-03 未达/未起跑:自测报告 §6 已给出 B 重用墙实测论证(L2 跨核不可用 × DMA 甜点 × SIMT 封顶),非测试方法错误。若验收侧仍需对具体未过 case 按贵方清单补 profiling(行 nnz 分布、tile 切分、活跃核数、profiler 时间线),我们可在 hidevlab 按 case 补采后更新本帖。

设计 v1.1 已合入 competitions master(#1117);代码 feat/spmm-950-c64 @ 50571b9,待任务页验收通过后提 ops-sparse 上游 PR。

likedislike
HKFLYE
HKFLYE成员
18 天前 评论:

感谢反馈,当前issue问题已解决,此issue关闭。若后续还有相关的问题,可以重新开启issue,提供相关的环境和报错信息来提问。

likedislike
HKFLYEHKFLYE成员
18 天前 issue状态由 进行中 改变为 已完成
HKFLYEHKFLYE成员
18 天前 关闭了 issue