news 2026/7/5 20:14:59

CANN/ops-sparse稀疏算子模板库

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CANN/ops-sparse稀疏算子模板库

【免费下载链接】ops-sparse本项目是CANN提供的高性能稀疏矩阵计算的算子库,专注于优化稀疏矩阵的计算效率。项目地址: https://gitcode.com/cann/ops-sparse

name: sparse-op-templates description: ops-sparse 算子代码模板库,提供不同编程模型下的标准化代码骨架。根据目标芯片架构和编程模型选择对应模板。

Sparse 算子代码模板库

使用方法

根据目标芯片架构(arch20/arch22/arch35)和编程模型(SIMD/RegBase/SIMT)选择对应的模板文件:

templates/ ├── simd/ # 所有架构通用(默认首选) │ ├── op_tiling_data.h # TilingData 结构体模板 │ ├── op_kernel.h # kernel.h 签名模板 │ ├── op_kernel.cpp # Kernel 实现模板 │ └── op_host.cpp # Host 侧实现模板 ├── regbase/ # 仅 arch35(Ascend950)可用 │ ├── op_tiling_data.h # 含 UB buffer 大小字段 │ ├── op_kernel.h # kernel.h 签名模板 │ ├── op_kernel.cpp # __VEC_SCOPE__ + RegTensor 模板 │ └── op_host.cpp # 含 BufferLayout 预计算模板 └── simt/ # 仅 arch35(Ascend950)可用 ├── op_tiling_data.h # 含 nthreads 字段 ├── op_kernel.h # kernel.h 签名模板 ├── op_kernel.cpp # __simt_vf__ + asc_vf_call 模板 └── op_host.cpp # 含 nthreads 计算模板

{op_name}.h(公共头文件)的内容(描述符转换函数)见本文"描述符转换函数"章节,直接内联在算子头文件中,无需独立模板文件。

RegBase 模板与 SIMD 模板的关键区别:使用TBuf + LocalTensor(非TQue)、__VEC_SCOPE__块内RegTensor寄存器级 API、host 侧预计算 UB buffer 大小。

SIMT 模板与 SIMD/RegBase 模板的关键区别:使用__simt_vf__装饰器、asc_vf_call调度、grid-stride loop线程级并行、无TPipe/TQue/DataCopyPad(直接__gm__指针访问)。

编程模型与架构对应关系

架构支持的编程模型说明
arch22(Ascend910B/910_93)SIMD仅支持向量编程模型
arch20(Ascend310P)SIMD仅支持向量编程模型
arch35(Ascend950)SIMD / RegBase / SIMT三种模型均可,由架构师在 1.3.A 决策

架构无关性

  • SIMD 编程模型在所有架构上可用,是默认选择
  • Kernel 侧代码的架构差异由 AscendC 编译器屏蔽
  • RegBase 和 SIMT仅 Ascend950 (arch35) 可用,有独立模板目录(templates/regbase/templates/simt/),开发时直接参考对应模板扩展,不需额外技能

模板文件说明

1. {op_name}.h - 公共头文件

包含类型映射宏、描述符转换函数、公共常量。

2. {op_name}_tiling_data.h - TilingData 结构体

定义 Host/Kernel 共享的 Tiling 参数结构体。

3. {op_name}_kernel.h - Kernel 头文件

声明kernel_do函数签名和 Kernel 类声明。

4. {op_name}_host.cpp - Host 侧实现

包含参数校验 + Kernel launch 的完整骨架。

公共宏定义(来自现有代码)

以下是仓内已有的公共宏,新算子必须复用禁止重新定义

#define GM_ADDR uint8_t * #define CHECK_RET(cond, return_expr) \ do { if (!(cond)) { return_expr; } } while (0)

描述符转换函数(来自 aclsparse_descr_internal.h)

新算子应#include "aclsparse_descr_internal.h"使用内部结构体,并在本地头文件{op_name}.h中定义转换函数:

inline struct aclsparseContext *ToInternalHandle(aclsparseHandle_t handle) { return reinterpret_cast<struct aclsparseContext *>(handle); } inline struct aclsparseSpMatDescr *ToMatInner(aclsparseConstSpMatDescr_t desc) { return const_cast<struct aclsparseSpMatDescr *>( reinterpret_cast<const struct aclsparseSpMatDescr *>(desc)); } inline struct aclsparseDnVecDescr *ToVecInner(aclsparseConstDnVecDescr_t desc) { return const_cast<struct aclsparseDnVecDescr *>( reinterpret_cast<const struct aclsparseDnVecDescr *>(desc)); } inline struct aclsparseDnMatDescr *ToDnMatInner(aclsparseConstDnMatDescr_t desc) { return const_cast<struct aclsparseDnMatDescr *>( reinterpret_cast<const struct aclsparseDnMatDescr *>(desc)); }

kernel_do 签名模式

// {op_name}_kernel.h #ifndef {OP_NAME}_KERNEL_H_ #define {OP_NAME}_KERNEL_H_ #include "{op_name}_tiling_data.h" #define GM_ADDR uint8_t * // kernel_do 签名: // - 数据指针按算子需求填写(GM_ADDR) // - tiling 以 const 引用传入 // - numBlocks + stream 为通用参数 void {op_name}_kernel_do( GM_ADDR dataPtr1, GM_ADDR dataPtr2, ..., uint32_t numBlocks, const {Op}TilingData& tiling, void *stream); #endif

Generic API 算子:若需要 alpha/beta/computeType 参数,在 kernel_do 中按算子需求追加(如const void *alpha, const void *beta),并在 host 侧从描述符或接口参数中提取。

Host 骨架模式

// {op_name}_host.cpp // 禁止冗余 include:acl/acl.h、cann_ops_sparse_common.h、tiling/platform/platform_ascendc.h 均为冗余 #include <cstdint> #include <new> #include "log/log.h" #include "cann_ops_sparse.h" #include "{op_name}.h" #include "{op_name}_kernel.h" #include "aclsparse_handle_internal.h" #include "aclsparse_descr_internal.h" #include "host_utils.h" namespace { static aclsparseStatus_t Validate{Op}Params( aclsparseHandle_t handle, ...) { // 参数校验 - 每个参数 nullptr/value 检查 } static aclsparseStatus_t Launch{Op}Kernel( aclsparseHandle_t handle, ...) { // 描述符解析 -> TilingData 计算 -> kernel_do launch } } // namespace extern "C" { aclsparseStatus_t aclsparse{Op}( aclsparseHandle_t handle, ...) { aclsparseStatus_t status = Validate{Op}Params(handle, ...); if (status != ACL_SPARSE_STATUS_SUCCESS) return status; return Launch{Op}Kernel(handle, ...); } }

【免费下载链接】ops-sparse本项目是CANN提供的高性能稀疏矩阵计算的算子库,专注于优化稀疏矩阵的计算效率。项目地址: https://gitcode.com/cann/ops-sparse

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/5 20:14:24

提升AI聊天效率:chat0高级使用技巧与最佳实践

提升AI聊天效率&#xff1a;chat0高级使用技巧与最佳实践 【免费下载链接】chat0 Blazingly-fast, free, open source AI chat app 项目地址: https://gitcode.com/gh_mirrors/ch/chat0 Chat0是一款极速、免费且开源的AI聊天应用&#xff0c;它以隐私优先为原则&#xf…

作者头像 李华
网站建设 2026/7/5 20:11:57

4-20mA电流环与PIC单片机ADC接口设计指南

1. 4-20mA电流环基础与行业应用 工业自动化领域广泛采用4-20mA电流环作为信号传输标准&#xff0c;这种模拟量传输方式具有抗干扰能力强、传输距离远&#xff08;可达千米级&#xff09;等显著优势。电流环系统由发送端、传输线路和接收端三部分组成&#xff0c;其中4mA对应量程…

作者头像 李华
网站建设 2026/7/5 20:11:24

3分钟免费激活Windows系统:KMS_VL_ALL_AIO智能激活工具完整指南

3分钟免费激活Windows系统&#xff1a;KMS_VL_ALL_AIO智能激活工具完整指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统激活而烦恼吗&#xff1f;每次开机看到那个烦人的激…

作者头像 李华
网站建设 2026/7/5 20:11:22

如何通过LLPhant构建企业级PHP生成式AI应用?

如何通过LLPhant构建企业级PHP生成式AI应用&#xff1f; 【免费下载链接】LLPhant LLPhant - A comprehensive PHP Generative AI Framework using OpenAI GPT 4. Inspired by Langchain 项目地址: https://gitcode.com/gh_mirrors/ll/LLPhant 在当今AI技术快速发展的时…

作者头像 李华
网站建设 2026/7/5 20:11:17

CANN稀疏算子库Skill修改指南

修改 Skill 【免费下载链接】ops-sparse 本项目是CANN提供的高性能稀疏矩阵计算的算子库&#xff0c;专注于优化稀疏矩阵的计算效率。 项目地址: https://gitcode.com/cann/ops-sparse 适用于&#xff1a;agent/skills/*/SKILL.md、agent/skills/cannbot_references.json…

作者头像 李华
网站建设 2026/7/5 20:08:32

CANN/asc-devkit Matmul-Tiling类构造函数

Matmul Tiling类构造函数 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言&#xff0c;原生支持C和C标准规范&#xff0c;主要由类库和语言扩展层构成&#xff0c;提供多层级API&#xff0c;满足多维场景算子开发诉求。 项目地址: https:…

作者头像 李华