本项目是CANN提供的高性能稀疏矩阵计算的算子库,专注于优化稀疏矩阵的计算效率。
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
[需求]: 新增ops-sparse仓PR/issue模板 Co-authored-by: yang-di52<yangdi52@huawei.com> # message auto-generated for no-merge-commit merge: !9 merge master into master [需求]: 新增ops-sparse仓PR/issue模板 Created-by: yang-di52 Commit-by: yang-di52 Merged-by: wangzitao_leo Description: ## 变更描述 / Description 新增ops-sparse仓PR/issue模板 ## 改动类型 / Change Type - [ ] Bug 修复 / Bug Fix - [ ] 新功能 / New Feature - [ ] 性能优化 / Performance - [ ] 代码重构 / Refactoring - [x] 文档更新 / Documentation - [ ] 测试相关 / Test - [ ] 其它 / Other ## 关联 Issue / Related Issues - Closes [#5](https://gitcode.com/cann/ops-sparse/issues/5) - References # ## 测试信息 / Testing <!-- 简要测试说明或关键结果 / Brief test description or key results --> - [ ] 单元测试通过 / UT passed - [ ] 集成测试通过 / ST passed - [x] 人工验证通过 / Manual verified ## 检查清单 / Checklist - [x] 代码符合规范 / Code follows style guide - [x] 测试添加并通过 / Tests added and passed - [x] 文档已更新 / Docs updated if needed - [x] 无硬编码敏感信息 / No secrets hardcoded - [x] 提交信息符合规范 / Commit message follows convention See merge request: cann/ops-sparse!9 | 4 个月前 | |
同步 cannbot-skills 安装脚本 Co-authored-by: iuyi<iuyi3093@qq.com> # message auto-generated for no-merge-commit merge: !109 merge agent-init into master 同步 cannbot-skills 安装脚本 Created-by: iuyi Commit-by: iuyi Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> 同步 cannbot-skills 安装脚本 https://gitcode.com/cann/cannbot-skills/blob/9692a90e57801d98bdd49d273c160a0ac25212e2/plugins-community/cuda2ascend/example/init.sh ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-sparse!109 | 19 天前 | |
feat: 新增 aclsparseCsr2gebsr 算子(CSR→GEBSR 格式转换,Ascend950 arch35) Co-authored-by: cann-robot<cann@cann.team> Co-authored-by: yangzhenya<yangzhenya4@huawei.com> # message auto-generated for no-merge-commit merge: !106 merge feat/csr2gebsr into master feat: 新增 aclsparseCsr2gebsr 算子(CSR→GEBSR 格式转换,Ascend950 arch35) Created-by: m0_72281197 Commit-by: yangzhenya;cann-robot Merged-by: cann-robot Description: # Csr2gebsr算子 ## 算子概述 csr2gebsr 算子用于将 CSR(Compressed Sparse Row)格式的稀疏矩阵转换为 GEBSR(General Block Sparse Row)格式,即分块 CSR 格式。CSR 以单个非零元为单位存储,GEBSR 以 rowBlockDim × colBlockDim 的块为单位存储,全零块被跳过以实现压缩。参考 CUDA cusparse 的 cusparse<t>csr2gebsr 接口。 采用 Legacy 三步法 API(对标 cuSPARSE): 1. **bufferSize**:查询 workspace 大小(纯 Host 计算) 2. **Nnz**:计算 bsrRowPtrC 和非零块数 nnzb 3. **Convert**:填充 bsrColIndC + bsrValC dir 参数指定块内内存布局:ROW = 行主序,COLUMN = 列主序。 ### 支持数据类型 | 数据类型 | 精度版本前缀 | 元素大小 | |----------|-------------|----------| | float32 | S | 4B | | float16 | H | 2B | | bfloat16 | Bh | 2B | | int32 | I | 4B | ### 支持芯片 | 芯片型号 | NPU 架构 | 架构目录 | |----------|----------|----------| | Ascend 950 | dav-3510 | arch35 | ## 算子执行接口 算子共提供 9 个公开接口(Legacy 三步法,4 精度版本 × bufferSize + Convert,1 个类型无关 Nnz): | 接口 | 说明 | |------|------| | aclsparse{S\|H\|Bh\|I}csr2gebsr_bufferSize | 查询 workspace 大小(4 精度版本) | | aclsparseXcsr2gebsrNnz | 计算 bsrRowPtrC 和 nnzb(类型无关) | | aclsparse{S\|H\|Bh\|I}csr2gebsr | 执行 CSR→GEBSR 转换(4 精度版本) | ### aclsparseScsr2gebsr_bufferSize #### 产品支持情况 | 芯片型号 | 支持状态 | |----------|----------| | Ascend 950 | 支持 | #### 函数原型 cpp aclsparseStatus_t aclsparseScsr2gebsr_bufferSize( aclsparseHandle_t handle, aclsparseDirection_t dir, int m, int n, const aclsparseMatDescr_t descrA, const float *csrValA, const int *csrRowPtrA, const int *csrColIndA, int rowBlockDim, int colBlockDim, size_t *pBufferSizeInBytes); > aclsparseHcsr2gebsr_bufferSize / aclsparseBhcsr2gebsr_bufferSize / aclsparseIcsr2gebsr_bufferSize 参数相同,仅 csrValA 类型不同(const void* 或 const int*)。 #### 参数说明 | 参数 | 输入/输出 | 类型 | 说明 | |------|-----------|------|------| | handle | 输入 | aclsparseHandle_t | ops-sparse 库上下文句柄,不可为 nullptr | | dir | 输入 | aclsparseDirection_t | 块内内存布局(ROW 或 COLUMN) | | m | 输入 | int | 矩阵行数,m >= 0 | | n | 输入 | int | 矩阵列数,n >= 0 | | descrA | 输入 | aclsparseMatDescr_t | 输入矩阵描述符,type 必须为 GENERAL | | csrValA | 输入 | const float* | CSR 非零值数组(本函数不读取,可为 nullptr) | | csrRowPtrA | 输入 | const int* | CSR 行偏移数组,长度 m+1,m > 0 时不可为 nullptr | | csrColIndA | 输入 | const int* | CSR 列索引数组(本函数不读取,可为 nullptr) | | rowBlockDim | 输入 | int | 块行维度,> 0 | | colBlockDim | 输入 | int | 块列维度,> 0 | | pBufferSizeInBytes | 输出 | size_t* | 所需 workspace 字节数,不可为 nullptr | #### 约束说明 - m >= 0,n >= 0 - rowBlockDim > 0,colBlockDim > 0 - m、n、rowBlockDim、colBlockDim 各自 ≤ INT32_MAX/2 - mb × nb ≤ INT32_MAX(mb = ceil(m/rowBlockDim),nb = ceil(n/colBlockDim)) - descrA 的 matrixType 必须为 GENERAL,indexBase 必须为 ZERO 或 ONE - m > 0 时 csrRowPtrA 不可为 nullptr ### aclsparseXcsr2gebsrNnz #### 产品支持情况 | 芯片型号 | 支持状态 | |----------|----------| | Ascend 950 | 支持 | #### 函数原型 cpp aclsparseStatus_t aclsparseXcsr2gebsrNnz( aclsparseHandle_t handle, aclsparseDirection_t dir, int m, int n, const aclsparseMatDescr_t descrA, const int *csrRowPtrA, const int *csrColIndA, const aclsparseMatDescr_t descrC, int *bsrRowPtrC, int rowBlockDim, int colBlockDim, int *nnzTotalDevHostPtr, void *pBuffer); #### 参数说明 | 参数 | 输入/输出 | 类型 | 说明 | |------|-----------|------|------| | handle | 输入 | aclsparseHandle_t | ops-sparse 库上下文句柄,不可为 nullptr | | dir | 输入 | aclsparseDirection_t | 块内内存布局(ROW 或 COLUMN) | | m | 输入 | int | 矩阵行数,m >= 0 | | n | 输入 | int | 矩阵列数,n >= 0 | | descrA | 输入 | aclsparseMatDescr_t | 输入矩阵描述符 | | csrRowPtrA | 输入 | const int* | CSR 行偏移数组,长度 m+1,m > 0 时不可为 nullptr | | csrColIndA | 输入 | const int* | CSR 列索引数组,nnz > 0 时需提供合法指针 | | descrC | 输入 | aclsparseMatDescr_t | 输出矩阵描述符,不可为 nullptr | | bsrRowPtrC | 输出 | int* | 块行偏移数组,长度 mb+1,不可为 nullptr | | rowBlockDim | 输入 | int | 块行维度,> 0 | | colBlockDim | 输入 | int | 块列维度,> 0 | | nnzTotalDevHostPtr | 输出 | int* | 非零块数输出指针,不可为 nullptr | | pBuffer | 输入 | void* | workspace,不可为 nullptr | #### 约束说明 - 同 bufferSize 约束 - descrC 不可为 nullptr,matrixType 必须为 GENERAL - bsrRowPtrC 不可为 nullptr - nnzTotalDevHostPtr 不可为 nullptr(HOST 模式为 host 指针,DEVICE 模式为 device 指针) - pBuffer 不可为 nullptr - nnzTotalDevHostPtr 的指针类型必须与 aclsparseSetPointerMode 设置一致:HOST 模式传 host 指针(算子 D2H 回传 nnzb),DEVICE 模式传 device 指针(算子 D2D 回传) - 本 API 异步执行(on stream),调用方在调用 Convert 前须同步 stream 或读回 nnzb 确认 Nnz 完成 ### aclsparseScsr2gebsr #### 产品支持情况 | 芯片型号 | 支持状态 | |----------|----------| | Ascend 950 | 支持 | #### 函数原型 cpp aclsparseStatus_t aclsparseScsr2gebsr( aclsparseHandle_t handle, aclsparseDirection_t dir, int m, int n, const aclsparseMatDescr_t descrA, const float *csrValA, const int *csrRowPtrA, const int *csrColIndA, const aclsparseMatDescr_t descrC, float *bsrValC, int *bsrRowPtrC, int *bsrColIndC, int rowBlockDim, int colBlockDim, void *pBuffer); > aclsparseHcsr2gebsr / aclsparseBhcsr2gebsr / aclsparseIcsr2gebsr 参数相同,仅 csrValA/bsrValC 类型不同。 #### 参数说明 | 参数 | 输入/输出 | 类型 | 说明 | |------|-----------|------|------| | handle | 输入 | aclsparseHandle_t | ops-sparse 库上下文句柄,不可为 nullptr | | dir | 输入 | aclsparseDirection_t | 块内内存布局(ROW 或 COLUMN) | | m | 输入 | int | 矩阵行数,m >= 0 | | n | 输入 | int | 矩阵列数,n >= 0 | | descrA | 输入 | aclsparseMatDescr_t | 输入矩阵描述符 | | csrValA | 输入 | const float* | CSR 非零值数组,m > 0 时不可为 nullptr | | csrRowPtrA | 输入 | const int* | CSR 行偏移数组,长度 m+1,m > 0 时不可为 nullptr | | csrColIndA | 输入 | const int* | CSR 列索引数组,m > 0 时不可为 nullptr | | descrC | 输入 | aclsparseMatDescr_t | 输出矩阵描述符 | | bsrValC | 输出 | float* | GEBSR 非零块值数组,长度 nnzb×rowBlockDim×colBlockDim,m > 0 且 n > 0 时不可为 nullptr | | bsrRowPtrC | 输入/输出 | int* | 块行偏移数组,长度 mb+1,不可为 nullptr | | bsrColIndC | 输出 | int* | 块列索引数组,长度 nnzb,m > 0 且 n > 0 时不可为 nullptr | | rowBlockDim | 输入 | int | 块行维度,> 0 | | colBlockDim | 输入 | int | 块列维度,> 0 | | pBuffer | 输入 | void* | workspace,不可为 nullptr | #### 约束说明 - 同 Nnz 约束 - m > 0 时 csrValA、csrRowPtrA、csrColIndA 不可为 nullptr - m > 0 && n > 0 时 bsrValC、bsrColIndC 不可为 nullptr - m == 0 || n == 0 时跳过 kernel,直接返回 SUCCESS - 本 API 依赖前置 Nnz 已在 stream 上完成,调用方须在调用前同步 stream ### 返回值 | 返回值 | 说明 | |--------|------| | ACL_SPARSE_STATUS_SUCCESS | 操作成功 | | ACL_SPARSE_STATUS_HANDLE_IS_NULLPTR | handle 为 nullptr | | ACL_SPARSE_STATUS_INVALID_VALUE | 参数非法(负值、非法枚举、nullptr 指针、维度溢出) | | ACL_SPARSE_STATUS_MATRIX_TYPE_NOT_SUPPORTED | 矩阵类型非 GENERAL | | ACL_SPARSE_STATUS_EXECUTION_FAILED | aclrt API 调用失败 | | ACL_SPARSE_STATUS_INTERNAL_ERROR | 内部错误(如获取核数失败) | ### workspace 计算公式 - workspace 大小 = (mb + 1 + mb×nb + aivCoreNum) × sizeof(int32_t) - workspace 布局:[nnzBlocksPerRow(mb) | nnzbDev(1) | marker(mb×nb) | segSum(aivCoreNum)] - mb = ceil(m / rowBlockDim),nb = ceil(n / colBlockDim) - aivCoreNum 为 AI Core 数量 ### 输入数据契约 调用方必须保证(Host 侧无法校验 device 数据内容): - CSR 行内列索引必须按升序排列(Convert 阶段依赖二分查找定位目标块) - csrColIndA 每个元素(减去 baseA 后)必须落在 [0, n) 区间内 ## 实现架构 采用 SIMT 三层结构(class-based Dispatcher + asc_vf_call 混合编程模式),共 3 个 kernel: 1. **Kernel 1 (Nnz CountBlocksPerRow)**:逐块行扫描 CSR 行,用 marker 数组标记非零块,统计每行非零块数 nnzBlocksPerRow。多核按块行 mb 切分并行。 2. **Kernel 2 (PrefixSum)**:将 nnzBlocksPerRow 做 exclusive prefix sum 生成 bsrRowPtrC,并回传 nnzb。 - mb ≤ 128(useBlocks == 1):退化串行路径,单 kernel O(mb) - mb > 128(useBlocks > 1):融合并行路径,单 kernel 内 Phase1→SyncAll→Phase2→SyncAll→Phase3 3. **Kernel 3 (Convert)**:遍历 CSR 非零元,用 marker 做 BinarySearch 定位目标块位置,填充 bsrColIndC 和 bsrValC(按 dir 指定的 ROW/COLUMN 方向排列块内数据)。 ## 调用示例 示例代码如下,仅供参考,具体编译和执行过程请参考编译与运行样例。 ```cpp #include "acl/acl.h" #include "cann_ops_sparse.h" #include <iostream> int main() { aclError aclRet; aclsparseStatus_t spRet; aclRet = aclInit(nullptr); if (aclRet != ACL_SUCCESS) { std::cerr << "aclInit failed: " << aclRet << std::endl; return 1; } aclRet = aclrtSetDevice(0); if (aclRet != ACL_SUCCESS) { std::cerr << "aclrtSetDevice failed" << std::endl; aclFinalize(); return 1; } aclrtStream stream = nullptr; aclrtCreateStream(&stream); aclsparseHandle_t handle = nullptr; aclsparseCreate(&handle); aclsparseSetStream(handle, stream); aclsparseSetPointerMode(handle, ACL_SPARSE_POINTER_MODE_HOST); // 4x4 CSR matrix: // 1 0 0 0 // 0 0 0 0 // 0 0 0 2 // 0 0 0 0 int m = 4, n = 4, nnz = 2; int rowBlockDim = 2, colBlockDim = 2; int h_csrRowPtr[] = {0, 1, 1, 1, 2}; int h_csrColInd[] = {0, 3}; float h_csrVal[] = {1.0f, 2.0f}; aclsparseMatDescr_t descrA = nullptr, descrC = nullptr; aclsparseCreateMatDescr(&descrA); aclsparseSetMatType(descrA, ACL_SPARSE_MATRIX_TYPE_GENERAL); aclsparseSetMatIndexBase(descrA, ACL_SPARSE_INDEX_BASE_ZERO); aclsparseCreateMatDescr(&descrC); aclsparseSetMatType(descrC, ACL_SPARSE_MATRIX_TYPE_GENERAL); aclsparseSetMatIndexBase(descrC, ACL_SPARSE_INDEX_BASE_ZERO); int *d_rowPtr = nullptr, *d_colInd = nullptr; float *d_csrVal = nullptr; aclrtMalloc((void**)&d_rowPtr, 5*sizeof(int), ACL_MEM_MALLOC_HUGE_FIRST); aclrtMalloc((void**)&d_colInd, 2*sizeof(int), ACL_MEM_MALLOC_HUGE_FIRST); aclrtMalloc((void**)&d_csrVal, 2*sizeof(float), ACL_MEM_MALLOC_HUGE_FIRST); aclrtMemcpy(d_rowPtr, 5*sizeof(int), h_csrRowPtr, 5*sizeof(int), ACL_MEMCPY_HOST_TO_DEVICE); aclrtMemcpy(d_colInd, 2*sizeof(int), h_csrColInd, 2*sizeof(int), ACL_MEMCPY_HOST_TO_DEVICE); aclrtMemcpy(d_csrVal, 2*sizeof(float), h_csrVal, 2*sizeof(float), ACL_MEMCPY_HOST_TO_DEVICE); // Step 1: bufferSize size_t bufSize = 0; spRet = aclsparseScsr2gebsr_bufferSize(handle, ACL_SPARSE_DIRECTION_ROW, m, n, descrA, d_csrVal, d_rowPtr, d_colInd, rowBlockDim, colBlockDim, &bufSize); if (spRet != ACL_SPARSE_STATUS_SUCCESS) { std::cerr << "bufferSize failed" << std::endl; goto cleanup; } void *d_buffer = nullptr; aclrtMalloc(&d_buffer, bufSize, ACL_MEM_MALLOC_HUGE_FIRST); // Step 2: Nnz int mb = (m + rowBlockDim - 1) / rowBlockDim; int *d_bsrRowPtr = nullptr; aclrtMalloc((void**)&d_bsrRowPtr, (mb+1)*sizeof(int), ACL_MEM_MALLOC_HUGE_FIRST); int nnzb = 0; spRet = aclsparseXcsr2gebsrNnz(handle, ACL_SPARSE_DIRECTION_ROW, m, n, descrA, d_row See merge request: cann/ops-sparse!106 | 19 天前 | |
feat(prune): 新增 aclsparseLtSpMMAPrune 2:4 结构化稀疏剪枝算子 Co-authored-by: wang-zhiyue2<wangzhiyue2@huawei.com> # message auto-generated for no-merge-commit merge: !117 merge feat/prune-standalone into master feat(prune): 新增 aclsparseLtSpMMAPrune 2:4 结构化稀疏剪枝算子 Created-by: wang-zhiyue2 Commit-by: wang-zhiyue2 Merged-by: cann-robot Description: ## 描述 新增 aclsparseLtSpMMAPrune 算子,对标 NVIDIA cuSPARSELt 的 cusparseLtSpMMAPrune,对稠密矩阵执行 2:4 结构化稀疏剪枝,输出与输入同型的稠密存储矩阵(被置零元素以 0 表示)。该算子是结构化稀疏矩阵乘法的前置步骤。 **核心特性:** - 剪枝对象由 Matmul 描述符中 matA/matB 的 sparsity 字段决定:matA 为 ACL_SPARSE_LT_SPARSITY_50_PERCENT 时剪枝矩阵 A(A-sparse),matB 为 ACL_SPARSE_LT_SPARSITY_50_PERCENT 时剪枝矩阵 B(B-sparse) - 支持两种剪枝算法:STRIP(逐分组剪枝)与 TILE(逐 tile 剪枝,4x4 tile 内行/列联合约束,90 种有效配置) - 支持 4 种数据类型:FP32 / FP16 / BF16 / INT8 - 支持转置路径:transA/transB 通过切换剪枝方向实现,转置写回已向量化(TransDataTo5HD) - 目标平台:Ascend 950PR / 950DT(arch35 / DAV_3510) **新增文件:** - sparseLt/prune/arch35/prune_host.cpp:Host 侧 Tiling 计算 + kernel launch(tiling by value,异步执行,无额外 device 存储) - sparseLt/prune/arch35/prune_kernel.cpp:Kernel 侧实现,STRIP/TILE 双算法 dispatch,沿行向量化(Cast+Abs+Mul keepMask)+ 沿列标量回退 - sparseLt/prune/arch35/prune_kernel.h:Kernel launcher 声明 - sparseLt/prune/README.md:算子文档 - sparseLt/shared/aclsparselt_internal.h:裁剪版共享内部头(TilingData 结构 + md_* helper + 常量宏) - sparseLt/shared/aclsparselt_host.cpp:共享平台查询函数(get_cube_core_num / get_ub_size) - test/prune/:完整测试工程(golden / param / npu_wrapper / test.cpp / csv) **接口签名:** c aclsparseStatus_t aclsparseLtSpMMAPrune( aclsparseLtConstHandle_t handle, aclsparseLtConstMatmulDescriptor_t* matmulDescr, const void* d_in, void* d_out, aclsparseLtPruneAlg_t pruneAlg, aclrtStream stream); ## 关联的Issue ## 测试 - GTest + CSV 驱动的精度 ST,覆盖 L0/L1/L2 分级 - prune 算子共 65 个测试用例:57 功能精度 + 7 异常路径 + 1 结构属性验证 - 覆盖 4 dtype × STRIP/TILE × 转置 × A-sparse/B-sparse × k奇数 × 非对齐shape - CPU golden 参考实现独立于 kernel(SpMMAPruneGolden) - 全量回归通过(ascend950)  ## 文档更新 - 新增 sparseLt/prune/README.md:算子使用文档 - 更新 docs/zh/api_list.md:追加 prune API 接口文档 - 更新 include/cann_ops_sparseLt.h:追加 SpMMAPrune 声明 + Const 类型定义 ## 类型标签 - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-sparse!117 | 17 天前 | |
update readme and create | 7 个月前 | |
feat(prune): 新增 aclsparseLtSpMMAPrune 2:4 结构化稀疏剪枝算子 Co-authored-by: wang-zhiyue2<wangzhiyue2@huawei.com> # message auto-generated for no-merge-commit merge: !117 merge feat/prune-standalone into master feat(prune): 新增 aclsparseLtSpMMAPrune 2:4 结构化稀疏剪枝算子 Created-by: wang-zhiyue2 Commit-by: wang-zhiyue2 Merged-by: cann-robot Description: ## 描述 新增 aclsparseLtSpMMAPrune 算子,对标 NVIDIA cuSPARSELt 的 cusparseLtSpMMAPrune,对稠密矩阵执行 2:4 结构化稀疏剪枝,输出与输入同型的稠密存储矩阵(被置零元素以 0 表示)。该算子是结构化稀疏矩阵乘法的前置步骤。 **核心特性:** - 剪枝对象由 Matmul 描述符中 matA/matB 的 sparsity 字段决定:matA 为 ACL_SPARSE_LT_SPARSITY_50_PERCENT 时剪枝矩阵 A(A-sparse),matB 为 ACL_SPARSE_LT_SPARSITY_50_PERCENT 时剪枝矩阵 B(B-sparse) - 支持两种剪枝算法:STRIP(逐分组剪枝)与 TILE(逐 tile 剪枝,4x4 tile 内行/列联合约束,90 种有效配置) - 支持 4 种数据类型:FP32 / FP16 / BF16 / INT8 - 支持转置路径:transA/transB 通过切换剪枝方向实现,转置写回已向量化(TransDataTo5HD) - 目标平台:Ascend 950PR / 950DT(arch35 / DAV_3510) **新增文件:** - sparseLt/prune/arch35/prune_host.cpp:Host 侧 Tiling 计算 + kernel launch(tiling by value,异步执行,无额外 device 存储) - sparseLt/prune/arch35/prune_kernel.cpp:Kernel 侧实现,STRIP/TILE 双算法 dispatch,沿行向量化(Cast+Abs+Mul keepMask)+ 沿列标量回退 - sparseLt/prune/arch35/prune_kernel.h:Kernel launcher 声明 - sparseLt/prune/README.md:算子文档 - sparseLt/shared/aclsparselt_internal.h:裁剪版共享内部头(TilingData 结构 + md_* helper + 常量宏) - sparseLt/shared/aclsparselt_host.cpp:共享平台查询函数(get_cube_core_num / get_ub_size) - test/prune/:完整测试工程(golden / param / npu_wrapper / test.cpp / csv) **接口签名:** c aclsparseStatus_t aclsparseLtSpMMAPrune( aclsparseLtConstHandle_t handle, aclsparseLtConstMatmulDescriptor_t* matmulDescr, const void* d_in, void* d_out, aclsparseLtPruneAlg_t pruneAlg, aclrtStream stream); ## 关联的Issue ## 测试 - GTest + CSV 驱动的精度 ST,覆盖 L0/L1/L2 分级 - prune 算子共 65 个测试用例:57 功能精度 + 7 异常路径 + 1 结构属性验证 - 覆盖 4 dtype × STRIP/TILE × 转置 × A-sparse/B-sparse × k奇数 × 非对齐shape - CPU golden 参考实现独立于 kernel(SpMMAPruneGolden) - 全量回归通过(ascend950)  ## 文档更新 - 新增 sparseLt/prune/README.md:算子使用文档 - 更新 docs/zh/api_list.md:追加 prune API 接口文档 - 更新 include/cann_ops_sparseLt.h:追加 SpMMAPrune 声明 + Const 类型定义 ## 类型标签 - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-sparse!117 | 17 天前 | |
chore: 同步precommit检查脚本 Co-authored-by: iuyi<202313350054@nuist.edu.cn> # message auto-generated for no-merge-commit merge: !88 merge chore/precommit into master chore: 同步precommit检查脚本 Created-by: iuyi Commit-by: iuyi Merged-by: cann-robot Description: ## 描述 scripts/oat_check.sh 同步为ops-blas中的版本 https://gitcode.com/cann/ops-blas/blob/e976f4339d1d648b385b615ad2a484ecf737bfae/scripts/oat_check.sh ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-sparse!88 | 1 个月前 | |
feat(spmm): add arch22 spmm implementation and tests Co-authored-by: xssxyz<xssxyz@163.com> # message auto-generated for no-merge-commit merge: !92 merge master into master feat(spmm): add arch22 spmm implementation and tests Created-by: xssxyz Commit-by: xssxyz Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> spmm 算子 arch22 实现,包含测试代码 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ X] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-sparse!92 | 19 天前 | |
feat(prune): 新增 aclsparseLtSpMMAPrune 2:4 结构化稀疏剪枝算子 Co-authored-by: wang-zhiyue2<wangzhiyue2@huawei.com> # message auto-generated for no-merge-commit merge: !117 merge feat/prune-standalone into master feat(prune): 新增 aclsparseLtSpMMAPrune 2:4 结构化稀疏剪枝算子 Created-by: wang-zhiyue2 Commit-by: wang-zhiyue2 Merged-by: cann-robot Description: ## 描述 新增 aclsparseLtSpMMAPrune 算子,对标 NVIDIA cuSPARSELt 的 cusparseLtSpMMAPrune,对稠密矩阵执行 2:4 结构化稀疏剪枝,输出与输入同型的稠密存储矩阵(被置零元素以 0 表示)。该算子是结构化稀疏矩阵乘法的前置步骤。 **核心特性:** - 剪枝对象由 Matmul 描述符中 matA/matB 的 sparsity 字段决定:matA 为 ACL_SPARSE_LT_SPARSITY_50_PERCENT 时剪枝矩阵 A(A-sparse),matB 为 ACL_SPARSE_LT_SPARSITY_50_PERCENT 时剪枝矩阵 B(B-sparse) - 支持两种剪枝算法:STRIP(逐分组剪枝)与 TILE(逐 tile 剪枝,4x4 tile 内行/列联合约束,90 种有效配置) - 支持 4 种数据类型:FP32 / FP16 / BF16 / INT8 - 支持转置路径:transA/transB 通过切换剪枝方向实现,转置写回已向量化(TransDataTo5HD) - 目标平台:Ascend 950PR / 950DT(arch35 / DAV_3510) **新增文件:** - sparseLt/prune/arch35/prune_host.cpp:Host 侧 Tiling 计算 + kernel launch(tiling by value,异步执行,无额外 device 存储) - sparseLt/prune/arch35/prune_kernel.cpp:Kernel 侧实现,STRIP/TILE 双算法 dispatch,沿行向量化(Cast+Abs+Mul keepMask)+ 沿列标量回退 - sparseLt/prune/arch35/prune_kernel.h:Kernel launcher 声明 - sparseLt/prune/README.md:算子文档 - sparseLt/shared/aclsparselt_internal.h:裁剪版共享内部头(TilingData 结构 + md_* helper + 常量宏) - sparseLt/shared/aclsparselt_host.cpp:共享平台查询函数(get_cube_core_num / get_ub_size) - test/prune/:完整测试工程(golden / param / npu_wrapper / test.cpp / csv) **接口签名:** c aclsparseStatus_t aclsparseLtSpMMAPrune( aclsparseLtConstHandle_t handle, aclsparseLtConstMatmulDescriptor_t* matmulDescr, const void* d_in, void* d_out, aclsparseLtPruneAlg_t pruneAlg, aclrtStream stream); ## 关联的Issue ## 测试 - GTest + CSV 驱动的精度 ST,覆盖 L0/L1/L2 分级 - prune 算子共 65 个测试用例:57 功能精度 + 7 异常路径 + 1 结构属性验证 - 覆盖 4 dtype × STRIP/TILE × 转置 × A-sparse/B-sparse × k奇数 × 非对齐shape - CPU golden 参考实现独立于 kernel(SpMMAPruneGolden) - 全量回归通过(ascend950)  ## 文档更新 - 新增 sparseLt/prune/README.md:算子使用文档 - 更新 docs/zh/api_list.md:追加 prune API 接口文档 - 更新 include/cann_ops_sparseLt.h:追加 SpMMAPrune 声明 + Const 类型定义 ## 类型标签 - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-sparse!117 | 17 天前 | |
feat(prune): 新增 aclsparseLtSpMMAPrune 2:4 结构化稀疏剪枝算子 Co-authored-by: wang-zhiyue2<wangzhiyue2@huawei.com> # message auto-generated for no-merge-commit merge: !117 merge feat/prune-standalone into master feat(prune): 新增 aclsparseLtSpMMAPrune 2:4 结构化稀疏剪枝算子 Created-by: wang-zhiyue2 Commit-by: wang-zhiyue2 Merged-by: cann-robot Description: ## 描述 新增 aclsparseLtSpMMAPrune 算子,对标 NVIDIA cuSPARSELt 的 cusparseLtSpMMAPrune,对稠密矩阵执行 2:4 结构化稀疏剪枝,输出与输入同型的稠密存储矩阵(被置零元素以 0 表示)。该算子是结构化稀疏矩阵乘法的前置步骤。 **核心特性:** - 剪枝对象由 Matmul 描述符中 matA/matB 的 sparsity 字段决定:matA 为 ACL_SPARSE_LT_SPARSITY_50_PERCENT 时剪枝矩阵 A(A-sparse),matB 为 ACL_SPARSE_LT_SPARSITY_50_PERCENT 时剪枝矩阵 B(B-sparse) - 支持两种剪枝算法:STRIP(逐分组剪枝)与 TILE(逐 tile 剪枝,4x4 tile 内行/列联合约束,90 种有效配置) - 支持 4 种数据类型:FP32 / FP16 / BF16 / INT8 - 支持转置路径:transA/transB 通过切换剪枝方向实现,转置写回已向量化(TransDataTo5HD) - 目标平台:Ascend 950PR / 950DT(arch35 / DAV_3510) **新增文件:** - sparseLt/prune/arch35/prune_host.cpp:Host 侧 Tiling 计算 + kernel launch(tiling by value,异步执行,无额外 device 存储) - sparseLt/prune/arch35/prune_kernel.cpp:Kernel 侧实现,STRIP/TILE 双算法 dispatch,沿行向量化(Cast+Abs+Mul keepMask)+ 沿列标量回退 - sparseLt/prune/arch35/prune_kernel.h:Kernel launcher 声明 - sparseLt/prune/README.md:算子文档 - sparseLt/shared/aclsparselt_internal.h:裁剪版共享内部头(TilingData 结构 + md_* helper + 常量宏) - sparseLt/shared/aclsparselt_host.cpp:共享平台查询函数(get_cube_core_num / get_ub_size) - test/prune/:完整测试工程(golden / param / npu_wrapper / test.cpp / csv) **接口签名:** c aclsparseStatus_t aclsparseLtSpMMAPrune( aclsparseLtConstHandle_t handle, aclsparseLtConstMatmulDescriptor_t* matmulDescr, const void* d_in, void* d_out, aclsparseLtPruneAlg_t pruneAlg, aclrtStream stream); ## 关联的Issue ## 测试 - GTest + CSV 驱动的精度 ST,覆盖 L0/L1/L2 分级 - prune 算子共 65 个测试用例:57 功能精度 + 7 异常路径 + 1 结构属性验证 - 覆盖 4 dtype × STRIP/TILE × 转置 × A-sparse/B-sparse × k奇数 × 非对齐shape - CPU golden 参考实现独立于 kernel(SpMMAPruneGolden) - 全量回归通过(ascend950)  ## 文档更新 - 新增 sparseLt/prune/README.md:算子使用文档 - 更新 docs/zh/api_list.md:追加 prune API 接口文档 - 更新 include/cann_ops_sparseLt.h:追加 SpMMAPrune 声明 + Const 类型定义 ## 类型标签 - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-sparse!117 | 17 天前 | |
docs: aclsparseLt 描述符文档更名整理并清理 UT 构建忽略配置 Co-authored-by: zhengyifei<yiwaiii@mail.ustc.edu.cn> # message auto-generated for no-merge-commit merge: !108 merge docs/sparseLt-descriptor-readme into master docs: aclsparseLt 描述符文档更名整理并清理 UT 构建忽略配置 Created-by: zhengyifei Commit-by: zhengyifei Merged-by: cann-robot Description: ## 描述 将 aclsparseLt Mat/matmul 描述符 README 文档从单一接口说明整理为整个描述符类接口说明。同时清理.gitnore冗余配置。 ## 关联的Issue https://gitcode.com/cann/ops-sparse/issues/162 ## 测试 纯文档 + 配置变更,无代码改动。已做 CP5 检视。 ## 文档更新 - sparseLt/common/aclsparseLtMatmulDescriptorInit_README.md(更名 + 整理为 aclsparseLtDescriptor_README.md) - docs/zh/install/dir_structure.md(目录结构中 README 文件名同步更新) - .gitignore(移除误引入的 build_ut*/ 构建目录忽略配置) ## 类型标签 - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [x] 其他,请描述:清理 .gitignore 冗余配置(build_ut*/) See merge request: cann/ops-sparse!108 | 17 天前 | |
feat(arch35): 新增 aclsparseXcoosort COO 排序算子 Co-authored-by: chensi79<chensi79@huawei.com> # message auto-generated for no-merge-commit merge: !62 merge feat/aclsparse-xcoosort into master feat(arch35): 新增 aclsparseXcoosort COO 排序算子 Created-by: chensi79 Commit-by: chensi79 Merged-by: cann-robot Description: ## 描述 新增面向 Ascend950(arch35 / dav-3510)的 aclsparseXcoosort COO 坐标稳定排序能力。 - 新增 workspace 查询、ByRow 和 ByColumn 三个接口; - 原地重排 COO row/col,并输出排列数组 P; - 采用两趟 LSB RADIX_SORT 实现双键稳定排序; - nnz > 2048 时按 UB 容量生成多核 run,并通过 GM ping-pong、merge-path 完成稳定归并; - 适配主线目录重组,将实现集成到 sparse/coosort; ## 关联的Issue 关联 Issue:https://gitcode.com/cann/ops-sparse/issues/102 ## 测试 已通过: bash build.sh --ops=coosort --soc=ascend950 ops_sparseLt、ops_sparse、coosort_test 均构建成功。  readme示例代码执行成功  ## 文档更新 新增 coosort README,包含接口说明、约束、支持平台和调用示例;更新公共头文件接口声明。 ## 类型标签 - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-sparse!62 | 1 个月前 | |
更新src/test多架构并存方式 Co-authored-by: rueenov11<zhuruyi@huawei.com> # message auto-generated for no-merge-commit merge: !21 merge fix_docs into master 更新src/test多架构并存方式 Created-by: rueenov11 Commit-by: rueenov11 Merged-by: cann-robot Description: ## 描述 本 PR 完善 ops-sparse 仓的多架构目录规范与测试构建机制,并同步更新相关文档,主要变更如下: 1. **构建配置**:在根 CMakeLists.txt 中补充 SOC → 架构目录映射(910B / 910_93 → arch22,950 → arch35,310P → arch20),并将 arch22 纳入 ARCH_SPECIFIC_DIRS。 2. **测试框架**:新增 cmake/test.cmake,提供 ops_sparse_add_test(),按 SOC_ARCH_DIRS 自动选择 test/${operator}/${arch_dir}/${operator}_test.cpp 编译,无匹配则跳过。 3. **测试目录调整**:将测试样例迁移至 arch 子目录: - test/spmv/arch22/spmv_test.cpp(910B) - test/spmm/arch35/spmm_test.cpp(950) 4. **文档更新**: - CONTRIBUTING.md:对齐贡献流程章节结构,补充多架构并存规则与 spmm 示例。 - docs/zh/install/dir_structure.md:更新目录树框架,反映 ${arch_dir}/ 组织方式。 - docs/QUICKSTART.md:适配新版 Spmv 实现路径与调试样例。 - README.md、test/spmv/README.md:更新样例路径引用。 ## 关联的Issue https://gitcode.com/cann/ops-sparse/issues/21 ## 测试  测试通过。 ## 文档更新 - 更新了 CONTRIBUTING.md - 更新了 docs/zh/install/dir_structure.md - 更新了 docs/QUICKSTART.md - 更新了 README.md - 更新了 test/spmv/README.md ## 类型标签 - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [x] 其他,请描述:多架构目录规范与测试构建机制完善(CMake + test 目录结构调整) See merge request: cann/ops-sparse!21 | 2 个月前 | |
[文档更新]: 更新ops-sparse仓文档 Co-authored-by: rueenov11<zhuruyi@huawei.com> # message auto-generated for no-merge-commit merge: !7 merge readme_docs_update into master [文档更新]: 更新ops-sparse仓文档 Created-by: rueenov11 Commit-by: rueenov11 Merged-by: wangzitao_leo Description: ## 变更描述 / Description <!-- 本 PR 做了什么,为什么需要 / What does this PR do and why --> **1. 新增文档文件** - docs/zh/install/quick_install.md :新增中文快速安装指南,提供详细的安装步骤和配置说明 - docs/zh/api_list.md :新增中文 API 接口列表文档,优化接口说明和使用指南 - docs/QUICKSTART.md :新增快速入门指南,帮助开发者快速上手 - test/spmv/README.md :新增 SPMV 测试说明文档,详细介绍测试方法和用例 - install_deps.sh :新增依赖安装脚本,提供自动化的系统依赖安装功能,简化环境搭建过程 - requirements.txt :新增 Python 依赖配置文件,列出项目所需的 Python 包及其版本 - OAT.xml :新增项目配置文件,提供构建和测试相关的配置信息 - LICENSE :新增软件许可证文件,包含 CANN Open Software License Agreement Version 2.0 的详细条款 - SECURITY.md :新增安全声明文档,提供安全相关说明和漏洞报告流程 **2. 文档刷新** - README.md :更新项目主文档,整合最新的安装、使用和贡献指南 **3. 头文件重构** - 头文件移动与重命名 : - src/spmv/sparse_common.h → include/cann_ops_sparse_common.h - src/spmv/spmv_host.h → include/cann_ops_sparse.h ## 改动类型 / Change Type - [ ] Bug 修复 / Bug Fix - [ ] 新功能 / New Feature - [ ] 性能优化 / Performance - [ ] 代码重构 / Refactoring - [x] 文档更新 / Documentation - [ ] 测试相关 / Test - [ ] 其它 / Other ## 关联 Issue / Related Issues <!-- Closes #123 可自动关闭 / Closes #123 to auto-close --> https://gitcode.com/cann/ops-sparse/issues/3 - Closes # - References # ## 测试信息 / Testing <!-- 简要测试说明或关键结果 / Brief test description or key results --> - [x] 单元测试通过 / UT passed - [x] 集成测试通过 / ST passed - [x] 人工验证通过 / Manual verified ## 检查清单 / Checklist - [ ] 代码符合规范 / Code follows style guide - [ ] 测试添加并通过 / Tests added and passed - [x] 文档已更新 / Docs updated if needed - [ ] 无硬编码敏感信息 / No secrets hardcoded - [ ] 提交信息符合规范 / Commit message follows convention See merge request: cann/ops-sparse!7 | 4 个月前 | |
Fix:rectify OAT rule 过滤 csv 测试用例文件 Co-authored-by: zhanghua145<zhanghua25@mails.ucas.ac.cn> # message auto-generated for no-merge-commit merge: !39 merge fix/oat-csv-filter into master Fix:rectify OAT rule 过滤 csv 测试用例文件 Created-by: zhanghua145 Commit-by: zhanghua145 Merged-by: cann-robot Description: ## 描述 修改 OAT.xml,为 defaultPolicyFilter 增加 *.csv 文件过滤规则,并为 license policyitem 指定 filefilter=defaultPolicyFilter,使 csv 测试用例文件不再被 codecheck 拦截,无需手动屏蔽。 ## 关联的Issue [#80](https://gitcode.com/cann/ops-sparse/issues/80) ## 测试 本地确认 OAT.xml 语法正确,过滤规则生效。 ## 文档更新 无 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-sparse!39 | 2 个月前 | |
Fix: resolve multiple documentation issues (#64 #65 #66 #67 #68 #69 #70) Co-authored-by: Zitao Wang<wangzitao4@huawei.com> # message auto-generated for no-merge-commit merge: !33 merge issue_docs into master Fix: resolve multiple documentation issues (#64 #65 #66 #67 #68 #69 #70) Created-by: wangzitao_leo Commit-by: Zitao Wang Merged-by: cann-robot Description: ## 描述 本次 PR 修复多个文档反馈 Issue,涉及 spmm/spmv README 及仓库根目录 README.md、SECURITY.md: - [#66](https://gitcode.com/cann/ops-sparse/issues/66): spmm README 算子规格表格删除孤立的 <tr> 和多余的 </tr> 标签 - [#67](https://gitcode.com/cann/ops-sparse/issues/67): spmm README 样例执行命令补充 --soc=ascend950 参数 - [#68](https://gitcode.com/cann/ops-sparse/issues/68): spmm README 正文产品支持描述与表格对齐(Ascend 950PR/950DT) - [#69](https://gitcode.com/cann/ops-sparse/issues/69): spmm README 将"SOC 网关"更正为"SOC 架构映射" - [#70](https://gitcode.com/cann/ops-sparse/issues/70): spmv README Float Transpose 用例数从 17 更正为 15 - [#64](https://gitcode.com/cann/ops-sparse/issues/64): README.md 最新动态补充 SpMM 算子(2026/06) - [#65](https://gitcode.com/cann/ops-sparse/issues/65): SECURITY.md 删除三个不存在的 cmake 文件公网地址声明 ## 关联的Issue 本次 PR 关联的 Issue:[#64](https://gitcode.com/cann/ops-sparse/issues/64) [#65](https://gitcode.com/cann/ops-sparse/issues/65) [#66](https://gitcode.com/cann/ops-sparse/issues/66) [#67](https://gitcode.com/cann/ops-sparse/issues/67) [#68](https://gitcode.com/cann/ops-sparse/issues/68) [#69](https://gitcode.com/cann/ops-sparse/issues/69) [#70](https://gitcode.com/cann/ops-sparse/issues/70) ## 测试 本次为纯文档修改,无需编译/运行测试。 ## 文档更新 本次 PR 包含以下文档文件的更新: - README.md - SECURITY.md - test/spmm/README.md - test/spmv/README.md ## 类型标签 - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-sparse!33 | 2 个月前 | |
Fix: resolve multiple documentation issues (#64 #65 #66 #67 #68 #69 #70) Co-authored-by: Zitao Wang<wangzitao4@huawei.com> # message auto-generated for no-merge-commit merge: !33 merge issue_docs into master Fix: resolve multiple documentation issues (#64 #65 #66 #67 #68 #69 #70) Created-by: wangzitao_leo Commit-by: Zitao Wang Merged-by: cann-robot Description: ## 描述 本次 PR 修复多个文档反馈 Issue,涉及 spmm/spmv README 及仓库根目录 README.md、SECURITY.md: - [#66](https://gitcode.com/cann/ops-sparse/issues/66): spmm README 算子规格表格删除孤立的 <tr> 和多余的 </tr> 标签 - [#67](https://gitcode.com/cann/ops-sparse/issues/67): spmm README 样例执行命令补充 --soc=ascend950 参数 - [#68](https://gitcode.com/cann/ops-sparse/issues/68): spmm README 正文产品支持描述与表格对齐(Ascend 950PR/950DT) - [#69](https://gitcode.com/cann/ops-sparse/issues/69): spmm README 将"SOC 网关"更正为"SOC 架构映射" - [#70](https://gitcode.com/cann/ops-sparse/issues/70): spmv README Float Transpose 用例数从 17 更正为 15 - [#64](https://gitcode.com/cann/ops-sparse/issues/64): README.md 最新动态补充 SpMM 算子(2026/06) - [#65](https://gitcode.com/cann/ops-sparse/issues/65): SECURITY.md 删除三个不存在的 cmake 文件公网地址声明 ## 关联的Issue 本次 PR 关联的 Issue:[#64](https://gitcode.com/cann/ops-sparse/issues/64) [#65](https://gitcode.com/cann/ops-sparse/issues/65) [#66](https://gitcode.com/cann/ops-sparse/issues/66) [#67](https://gitcode.com/cann/ops-sparse/issues/67) [#68](https://gitcode.com/cann/ops-sparse/issues/68) [#69](https://gitcode.com/cann/ops-sparse/issues/69) [#70](https://gitcode.com/cann/ops-sparse/issues/70) ## 测试 本次为纯文档修改,无需编译/运行测试。 ## 文档更新 本次 PR 包含以下文档文件的更新: - README.md - SECURITY.md - test/spmm/README.md - test/spmv/README.md ## 类型标签 - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-sparse!33 | 2 个月前 | |
fix: build.sh --run 将不支持当前架构的算子标记为 skipped 而非 failed (#93) Co-authored-by: zhanghua145<zhanghua25@mails.ucas.ac.cn> # message auto-generated for no-merge-commit merge: !56 merge fix/skip-unsupported-ops into master fix: build.sh --run 将不支持当前架构的算子标记为 skipped 而非 failed (#93) Created-by: zhanghua145 Commit-by: zhanghua145 Merged-by: cann-robot Description: ## 修复内容 修复 #93 :build.sh --run 在测试二进制不存在时,将不支持当前架构的算子标记为 failed 而非 skipped,导致测试汇总误报失败。 ### 原因分析 - spmv 仅在 src/spmv/arch22/ 下有实现,ascend950(arch35)无对应源码 - CMake 构建阶段已正确跳过 spmv,但 build.sh 的 --run 逻辑在发现测试二进制不存在时直接判定为 failed ### 修复方案(参考 ops-blas 仓的 skip 机制) 1. cmake/test.cmake:跳过算子时写入 skipped_tests.list 2. test/CMakeLists.txt:初始化 skipped_tests.list 3. build.sh:读取 skip 清单,新增 SKIPPED_OPS 和 print_skip,汇总新增 Skipped 行 ### 验证结果 bash build.sh --run --soc=ascend950 Test Summary: Passed: 4 - csrgeam2 gtsv_interleaved_batch nnz spmm Skipped: 1 - spmv (not supported on ascend950) Failed: 0 See merge request: cann/ops-sparse!56 | 1 个月前 | |
fix: 修正 install_deps.sh 中 pigz 安装提示与成功消息不一致问题 Co-authored-by: LambdaMiX<202400800552@mail.sdu.edu.cn> # message auto-generated for no-merge-commit merge: !94 merge fix/install-deps-pigz into master fix: 修正 install_deps.sh 中 pigz 安装提示与成功消息不一致问题 Created-by: LambdaMiX Commit-by: LambdaMiX Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ### 问题描述 install_deps.sh 脚本存在两个问题: 1. **pigz 安装提示与默认行为不一致**: install_pigz() 函数中 read -p "Install pigz? [Y/n]" 提示符 [Y/n] 暗示 Y 为默认选项,但用户按 Enter(空输入)时实际走"跳过安装"分支,导致用户以为选择了 Yes 却跳过了 pigz 安装。 2. **成功消息误报**:pigz 被跳过后,脚本末尾仍无条件打印 "All dependencies installed successfully!",与实际状态不一致,在自动化流程中会造成误判。 该问题与 ops-blas PR #303 修复的问题完全一致,install_pigz() 和 main() 中 pigz 相关代码两个仓库逐字相同,修复方案直接复用。 ### 修改内容 - 修正 install_pigz() 中 read 交互逻辑:空输入视为 Yes(符合 [Y/n] 惯例) - 新增 PIGZ_SKIPPED 变量追踪 pigz 跳过状态 - main() 末尾根据 PIGZ_SKIPPED 输出不同消息:跳过时根据 $OS/$PKG_MANAGER 动态生成安装提示命令(macOS→brew,其他→sudo $PKG_MANAGER install),而非声称全部安装成功 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> [#123](https://gitcode.com/cann/ops-sparse/issues/123) ## 测试 <!--描述进行了哪些测试来验证你的改动。--> 1. 交互模式:运行 bash install_deps.sh,pigz 未安装时按 Enter,确认 pigz 被安装(而非跳过) 2. 交互模式:输入 n,确认 pigz 被跳过,且末尾输出提示用户手动安装的消息(根据 OS 动态生成命令) 3. 非交互模式:echo "n" | bash install_deps.sh,确认脚本正常完成且输出消息准确 4. pigz 已安装场景:确认脚本正常识别并跳过安装步骤 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> 无 ## 类型标签 <!-- [x] 表示选中 --> - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-sparse!94 | 1 个月前 | |
fix: 修复文档与仓库结构不一致问题,补充贡献指南 Co-authored-by: rueenov11<zhuruyi@huawei.com> # message auto-generated for no-merge-commit merge: !16 merge fix_docs into master fix: 修复文档与仓库结构不一致问题,补充贡献指南 Created-by: rueenov11 Commit-by: rueenov11 Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> 1. 修复 README 目录结构与实际仓库不一致 - 移除内联的错误目录树( example 、 tests ),替换为指向独立目录结构文档的链接 - 新增说明:当前算子调用样例位于 test/ 目录下, examples/ 为预留目录 - 新建 docs/zh/install/dir_structure.md ,准确描述仓库真实目录层级 2. 修复 QuickStart 中路径描述错误 - sparse/src/spmv_kernel.cpp → src/spmv/spmv_kernel.cpp (共 2 处) 3. README 增加版本兼容说明 - 新增"🛠️环境准备"和"⬇️源码下载"章节,在 README 级别明确 CANN 版本配套关系 - 注明"本项目仅支持CANN 8.5.0及后续版本",并链接至 release 仓库 4. Python 依赖补充版本范围 - requirements.txt 中各包名补充经过验证的版本范围(如 numpy>=1.21,<2 、 protobuf>=3.20,<6 ) 5. 接口文档补充能力边界备注 - docs/zh/api_list.md 末尾新增"备注"章节,说明接口能力以当前实现版本为准,详细限制参考各算子 README 及头文件注释 6. 补充贡献指南 - 新建 CONTRIBUTING.md ,包含新算子贡献、Bug修复、算子优化、文档纠错等贡献场景的完整流程 - 交付件目录结构适配 ops-sparse 仓实际结构( src/${operator}/ 、 test/${operator}/ ) ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> https://gitcode.com/cann/ops-sparse/issues/7 https://gitcode.com/cann/ops-sparse/issues/10 https://gitcode.com/cann/ops-sparse/issues/14 https://gitcode.com/cann/ops-sparse/issues/15 ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-sparse!16 | 2 个月前 |
ops-sparse
🔥Latest News
- [2026/06] 新增稀疏矩阵-稠密矩阵乘法(SpMM)算子实现。
- [2026/05] ops-sparse项目上线,提供稀疏矩阵计算的API以及优化的稀疏矩阵向量乘法实现。
🚀概述
ops-sparse是CANN (Compute Architecture for Neural Networks)算子库中提供高性能稀疏矩阵计算的算子库,专注于优化稀疏矩阵的计算效率。
🛠️环境准备
环境部署是体验本项目能力的前提,请先完成NPU驱动、CANN包安装等,确保环境正常。
说明:本项目仅支持CANN 9.0.0及后续版本,源码版本与CANN版本配套关系参见release仓库。
⬇️源码下载
环境准备好后,下载与CANN版本配套的分支源码,命令如下,${tag_version}替换为分支标签名。
说明:若环境中已存在配套分支源码,可跳过本步骤,例如CANNLab默认已提供最新商发版CANN对应的源码。
git clone -b ${tag_version} https://gitcode.com/cann/ops-sparse.git
说明:对于CANNLab云开发环境,已默认提供最新商发CANN版本配套的源码,如需获取其他版本源码,参考上述命令获取。
📖学习教程
🔍目录结构
ops-sparse仓关键目录结构请参见目录结构。
说明:当前算子调用样例位于
test/目录下(如test/spmv/arch22/spmv_test.cpp),examples/为预留目录。各算子的详细调用说明可参考test/<算子名>/README.md。
💬相关信息
🤝联系我们
本项目功能和文档正在持续更新和完善中,建议您关注最新版本。