CANN社区任务-SpSM算子开发

7月社区任务-SpSM算子开发任务书

【免费下载链接】cann-ops-competitions本仓库用于 CANN 开源社区各类竞赛、开源课题、社区任务等课题发布、开发者作品提交和展示。项目地址: https://gitcode.com/cann/cann-ops-competitions

基础信息

  • 技术标签:算子开发
  • 适配硬件:Ascend 950PR
  • 开源仓地址:https://gitcode.com/cann/ops-sparse
  • CANN 版本:算子开源仓指定版本
  • 开发语言:Ascend C + C++(aclsparse 接口)
  • 对标参考:cuSPARSE cusparseSpSM §6.6.12

任务概述

参考 cuSPARSESpSM(Sparse triangular Solve with Multiple right-hand sides),在昇腾 NPU 上实现稀疏三角求解:

$$ op(A) \cdot X = \alpha \cdot op(B) \quad\Rightarrow\quad X = \alpha \cdot op(A)^{-1} op(B) $$

或等价形式 $C = \alpha \cdot op(A)^{-1} op(B)$(cuSPARSE 以稠密matC存解)。

各参数含义说明:

  1. $A$:稀疏三角系数矩阵,仅支持上三角/下三角格式,存储格式为CSR
  2. $op(\cdot)$:矩阵操作符,可选不转置op(A)=A或转置op(A)=A^T
  3. $X$:方程组求解输出,稠密矩阵,与等价式中 $C$ 完全等同;
  4. $B$:多右端稠密输入矩阵,多列代表多组并行方程组;
  5. $\alpha$:全局浮点缩放标量,用于整体缩放计算结果;
  6. $A^{-1}$:稀疏三角矩阵的逆,算子内部通过三角回代间接求解,不生成显式逆矩阵。

验收口径

  • C++aclsparseSpSM*与 cuSPARSE 调用流程对齐(bufferSize预备 →analysissolveupdateMatrix为可选数值更新路径)。

典型场景

图预条件、三角分解回代(ILU/IC 求解)、稀疏三角系统多 RHS 求解。


核心开发要求及验收标准

1. C++ 层接口(必选,对齐 cuSPARSE

cuSPARSE SpSM 核心流程为bufferSize预备 →analysissolve三步骤(另含描述符createDescr/destroyDescr与可选updateMatrix),须完整实现:

aclsparseStatus_t aclsparseSpSMCreateDescr(aclsparseSpSMDescr_t *spsmDescr); aclsparseStatus_t aclsparseSpSMDestroyDescr(aclsparseSpSMDescr_t spsmDescr); aclsparseStatus_t aclsparseSpSMGetBufferSize( aclsparseHandle_t handle, aclsparseOperation_t opA, aclsparseOperation_t opB, const void *alpha, aclsparseConstSpMatDescr_t matA, aclsparseConstDnMatDescr_t matB, aclsparseDnMatDescr_t matC, aclDataType computeType, aclsparseSpSMAlg_t alg, aclsparseSpSMDescr_t spsmDescr, size_t *bufferSize); aclsparseStatus_t aclsparseSpSMAnalysis( aclsparseHandle_t handle, aclsparseOperation_t opA, aclsparseOperation_t opB, const void *alpha, aclsparseConstSpMatDescr_t matA, aclsparseConstDnMatDescr_t matB, aclsparseDnMatDescr_t matC, aclDataType computeType, aclsparseSpSMAlg_t alg, aclsparseSpSMDescr_t spsmDescr, void *externalBuffer); aclsparseStatus_t aclsparseSpSMSolve( aclsparseHandle_t handle, aclsparseOperation_t opA, aclsparseOperation_t opB, const void *alpha, aclsparseConstSpMatDescr_t matA, aclsparseConstDnMatDescr_t matB, aclsparseDnMatDescr_t matC, aclDataType computeType, aclsparseSpSMAlg_t alg, aclsparseSpSMDescr_t spsmDescr); aclsparseStatus_t aclsparseSpSMUpdateMatrix( aclsparseHandle_t handle, aclsparseSpSMDescr_t spsmDescr, void *newValues, aclsparseSpSMUpdate_t updatePart);

格式:仅支持CSR(与 cuSPARSE 对齐)。

调用语义(与 cuSPARSE §6.6.12 一致):

  • bufferSize/analysismatBmatCvalues 指针可为 NULL(仅用于 workspace 估算与符号分析);描述符本身不可为 NULL
  • solvematBmatC须指向有效 values;
  • in-placematBmatC可使用同一 values 设备指针(其余稠密描述符字段如order可独立设置)。

工程目录

ops-sparse/src/spsm/

2. 数据类型支持

对标范围:对齐 cuSPARSE cusparseSpSM §6.6.12 官方 dtype 表。SpSM 为同精度matAvalues、matBmatCcomputeType四者 dtype 相同(cuSPARSE 文档无 Mixed-precision 小节)。

列含义

  • A:稀疏三角系数矩阵matA的 values;
  • B:稠密右端项matB(多 RHS);
  • C:稠密解matC
  • computeType:实际计算精度。

稀疏格式与索引

项目本任务
稀疏格式CSR
索引int32INDEX_32I
fill / diagLOWER/UPPER、UNIT/NON_UNIT(映射 cuSPARSE fill/diag 属性)

SpSM 为全新算子(ops-sparse 仓当前无src/spsm/),aclsparseSpSM*+ Kernel 均须从零交付。

2.1 dtype 组合
A / B / C / computeTypecuSPARSE 枚举状态
fp32CUDA_R_32F待实现

alpha标量 dtype 与computeType一致(为float32)。

验收:须覆盖 ACLaclsparseSpSM*(bufferSize / analysis / solve)+updateMatrix全链路。

3. 算子约束

  1. analysis 与 solve 间不得修改 matA 结构、externalBufferspsmDescr(与 cuSPARSE 一致);
  2. updateMatrix仅更新数值、结构不变时可跳过 re-analysis(对标 cuSPARSE);
  3. solve 阶段 bit-wise 确定性(cuSPARSE 保证);
  4. 多 RHS:matB/matC[m, nrhs]稠密矩阵;
  5. in-placematBmatC可共用同一 values 指针(cuSPARSE 支持);
  6. bufferSize/analysismatB/matC的 values 可为 NULL;solve须提供有效 values;描述符不可为 NULL。

4. 功能验收用例

编号场景参考
TC-01下三角 unit_diag=FalsecuSPARSE CSR sample
TC-02上三角 + transpose自行构造
TC-03nrhs=1 与 nrhs>1自行构造
TC-04updateMatrix 后 re-solvecuSPARSE
TC-05matB/matC in-place(同一 values 指针)cuSPARSE
TC-06bufferSize/analysis 阶段 matB/matC values 为 NULLcuSPARSE

5. 性能要求

对标cuSPARSE SpSM(A100),NPU 性能须达到 GPU 参考实现的1.0 倍及以上(即 ≥1.0×)。

固定参考用例(必测 3 组;在NVIDIA A100上实测 cuSPARSE 耗时填入「GPU 参考耗时」,取多次运行avg,analysis 一次性开销可单独报告,作为 NPU 验收基准):

编号场景mnnznrhsdtypeGPU 参考耗时 (μs)达标要求
01下三角多 RHS 基础 solve25627258fp322203NPU ≥ 1.0×
02updateMatrix 后 re-solve12813224fp322291NPU ≥ 1.0×
03analysis 阶段 NULL values12813274fp322014NPU ≥ 1.0×

泛化覆盖范围另抽 200 组用例;由下列维度组合抽样或网格扫描生成,须附完整用例列表;solve 阶段性能达标 ≥1.0×):

维度覆盖范围
矩阵规模m:10²~10⁵;nnzm成比例(平均度约 5~50)
多 RHSnrhs:1、8、32、128
三角属性下三角 / 上三角;unit_diagTrue / False;transTrue / False 等组合须纳入 200 组抽样
稀疏结构随机三角 CSR
更新路径updateMatrix后 re-solve 至少 5 组(数值变、结构不变)
in-place / NULL valuesmatB/matC 共用 values 至少 5 组;bufferSize/analysis 阶段 NULL values 至少 5 组
边界m=1nrhs=1;近奇异对角(条件数偏大样本 5 组,仅功能验收)

6. 精度要求

《生态算子开源精度标准》+ AscendOpTest + ATK 双标杆L2(2 / 1.2 / 1.2)。

真值:以cuSPARSE CPU 标杆或双精度参考为准。

7. 接口分层

aclsparseSpSM*(必选) → Ascend C Kernel(必选)

8. 验收交付件

1, 自测用例、测试结果报告、测试步骤指导文档

2, 算子代码的私仓邀请链接、代码仓路径、分支、算子目录

9. PR 合入路径

https://gitcode.com/cann/ops-sparse/tree/master/src/spsm

环境获取

  1. 开源仓提供100小时免费时长,请不使用时及时关闭,用时耗尽前请务必保存相关资料,建议及时提交备份。
  2. 使用 hidevlab notebook 算力。
  3. 如需额外环境资源,请联系昇腾小助手。

特别注意事项

  1. SpSManalysis 缓存是性能关键,须在文档中说明复用条件;
  2. 新增接口需对齐 cuSPARSE 风格;
  3. 三角性、对角类型须在描述符层显式设置(映射 cuSPARSE fill/diag 属性);
  4. 设计文档按社区模板;
  5. README 含aclsparse C++调用示例;
  6. 自验证报告含 aclsparse 测试、AscendOpTest/ATK 日志。

【免费下载链接】cann-ops-competitions本仓库用于 CANN 开源社区各类竞赛、开源课题、社区任务等课题发布、开发者作品提交和展示。项目地址: https://gitcode.com/cann/cann-ops-competitions

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考