跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++AI算法

昇腾 Ascend C 编程指南:从语法基础到算子开发实战

综述由AI生成Ascend C 是基于 C/C++ 的昇腾硬件专用编程语言,支持自定义算子开发。文章介绍了其核函数模型、SPMD 并行机制及流水线编程范式。通过基础与高层 API 分层设计,开发者可实现高效的数据搬运与计算。内容涵盖 Kernel 定义、算子类实现(Init/Process)、主机端调用及数据验证脚本,提供从 CPU 模拟到 NPU 部署的全流程实践指导。

Eee_123发布于 2026/3/28更新于 2026/6/720 浏览
昇腾 Ascend C 编程指南:从语法基础到算子开发实战

昇腾 Ascend C 编程指南:从语法基础到算子开发实战

Ascend C 算子是什么

Ascend C 算子示意图

Ascend C 算子是基于 CANN 推出的支持 C/C++ 标准规范的编程语言 Ascend C 所开发的算子。编写的算子程序经编译器编译和运行时调度可在昇腾硬件上运行,助力开发者高效实现自定义创新算法。使用它开发自定义算子具有遵循 C/C++ 编程规范、自动并行调度获得最优执行性能、结构化核函数简化算子开发逻辑、CPU/NPU 孪生调试提升算子调试效率等优势。

Ascend C 编程模型

Ascend C 的核函数是算子在设备侧 AI Core 的执行入口,也是连接 CPU 与 NPU 的桥梁。编写核函数定义设备端计算逻辑,编译后可在昇腾硬件并行执行,是自定义算子的核心载体。

采用 SPMD 模型,仅需写一份核函数代码,设备会自动分发到多 AI Core。各核心通过内置变量 block_idx 区分身份,独立处理数据分片,实现一份代码、多核心并行处理不同数据。

核函数开发规则 需添加特定限定符,明确运行载体和类型:

  • global:标识为可被主机端调用的设备函数。
  • __aicore:明确在昇腾 AI Core 上执行(区别于 CUDA 的核函数)。

参数与变量规则 入参类型仅支持指针(需用 gm 标识指向全局内存,如 gm float*)或 C/C++ 内置类型(如 int32_t)。

调用流程 核函数如何被主机端触发?主机端通过特定语法调用核函数,需指定并行配置:

  • blockDim:指定参与执行的 AI Core 数量。
  • l2ctrl:保留参数,暂设为 nullptr。
  • stream:任务队列(aclrtStream 类型),用于管理设备端任务的并行、串行执行。

需配合 AscendCL(昇腾计算库)完成初始化、资源管理等步骤。

Ascend C 硬件架构抽象与编程范式

Ascend C 基于硬件抽象架构,采用流水线式编程范式,将算子拆分为多个流水任务,通过 Queue 实现任务通信同步、Pipe 统一管理内存资源。

核心的 Vector 编程范式明确 CopyIn、Compute、CopyOut 三阶段流程,结合逻辑存储位置 TPosition 和张量对象 Global/LocalTensor 管理数据,并通过 Pipe、TBuf 分别完成常规与临时变量的内存分配回收,以此支撑算子在昇腾硬件上的高效开发执行。

这种架构屏蔽底层差异,依托 Pipe 统一管理设备侧资源。通过 Queue 实现任务通信同步,保障内存高效利用,支撑算子在昇腾硬件上的高效开发与执行。

Ascend C API 体系:基础与高层 API 的分层赋能

Ascend C API 体系图

Ascend C 的 API 体系分为基础 API 和高层 API,分别支撑底层功能灵活组合与上层算法快速落地的开发需求。

基础 API:底层能力的灵活拼接
  1. 计算类 API:分为标量(Scalar 单元)、向量(Vector 单元)、矩阵(Cube 单元)三类,适配不同粒度的计算场景。
  2. 数据搬运 API:以 DataCopy 为核心,实现 Global Memory 与 Local Memory 间的数据迁移。
  3. 内存管理 API:通过 AllocTensor/FreeTensor 管理内存生命周期。
  4. 任务同步 API:通过 EnQue/DeQue 实现任务间通信。
高层 API:上层算法的高效封装

高层 API 封装了 Matmul、Softmax 等常用算法逻辑,借助'对象化封装 + 流程化调用'模式,将复杂算法逻辑转化为简洁的 API 调用,既减少了重复开发工作,又大幅提升了开发效率。

基于 Kernel 直调工程的算子开发
核函数定义

用 global __aicore 限定符定义设备侧入口,调用算子类的初始化与处理函数。

算子类实现

通过 CopyIn(数据从 Global 搬入 Local)、Compute(向量加法)、CopyOut(结果搬出至 Global)三个流水任务实现逻辑,结合 Queue 做任务同步、Pipe 做内存管理。

Init 实现

KernelAdd 类的 Init 方法主要做两件事:

  1. 通过 block_idx 给当前 AI Core 划分全局内存数据,把 xGM、yGM、zGM 绑定到当前核心的处理区域,实现多核并行。
  2. 用 pipe 初始化输入输出队列的双缓冲内存,按 TILE_LENGTH 分配内存块,队列深度设为 BUFFER_NUM,支撑流水线并行。
Process() 实现

KernelAdd 类的 Process() 方法通过循环调度 CopyIn、Compute、CopyOut 三个阶段,结合双缓冲实现流水线并行。

流程中,CopyIn 将全局内存数据搬入本地并通过队列同步,Compute 执行向量加法并将结果入队,CopyOut 将结果搬回全局内存,借助双缓冲和流水线机制让数据搬运与计算并行,提升昇腾 AI Core 的 Vector 单元利用率。

主机侧 main.cpp

包含 CPU 模式逻辑(用于算法逻辑快速验证,不依赖昇腾硬件,直接在 CPU 上执行计算)和 NPU 模式主机侧逻辑(用于在昇腾 NPU 硬件上执行算子,充分利用硬件加速能力)。

数据生成脚本 gen_data.py

基于 NumPy 编写,用于生成 AddCustom 算子的输入数据和真值数据,为算子的功能验证提供标准化的输入与预期结果参考。

实现逻辑:

  • 生成两个形状为(8, 2048)的 float16 随机输入数据 input_x 和 input_y(数值范围 1-100)。
  • 计算加法算子的真值数据 golden(即 input_x + input_y)。
  • 将输入数据和真值数据以二进制格式分别保存到指定路径,供后续算子调用、验证时使用。

用途:为 AddCustom 算子的开发、调试和测试提供一致的输入源与真值基准,确保算子计算结果的准确性。

简单工程执行

Ascend C 算子的简易工程执行方式:将编译和执行命令封装到 run.sh 脚本中,可通过不同参数实现 CPU 和 NPU 模式下的算子运行调试。

CPU 模式:

bash run.sh -v Ascend910x -r cpu

通过 md5 校验 output_z.bin 与 golden.bin 一致性验证执行成功;架构依赖 Host APP、CPU 调用库、算子 kernel 程序和 AscendC 类库。

NPU 模式:

bash run.sh -v Ascend910x -r npu

通过 md5 校验验证编译、执行成功;架构依赖 Host APP、AscendCL API 库及设备侧算子 kernel 程序、AscendC 类库,实现主机 - 设备交互与功能验证。

  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 手把手教你在AutoDL上用LLaMA-Factory微调GPT-OSS-20B模型(LoRA版)
  • 2020 年 CSP-S 提高组初赛真题解析:阅读程序第 1 题
  • OpenVLA 模型解析:基于 Prismatic VLM 与下一个 Token 预测的动作生成
  • 前端股票行情 SDK:stock-sdk,支持浏览器与 Node.js
  • 漏洞挖掘入门教程:从零开始掌握基本过程
  • 力扣第 46、47 题:全排列与去重全排列算法解析
  • Python 脚本打包成 EXE 应用的 6 种主流方法
  • 多源 BFS 算法详解与经典题目实战
  • 基于 YOLOv8/v11/v26 与 LLM 的 Web 视觉分析系统
  • 后仿真 SDF 反标 Warning 描述与解决方案
  • LazyLLM 多 Agent 应用实战:源码部署与 Web 调试指南
  • 前端面试核心知识点整理(含 JavaScript、Vue、React 等)
  • C++ STL 容器适配器详解:Stack、Queue 与 Priority Queue 的本质与实现
  • C++ STL 栈与队列模拟实现及容器适配器原理
  • 分布式文件系统 HDFS:编程实践与 Java API 详解
  • Virt-A-Mate 虚拟实境交互平台技术解析
  • 并查集数据结构详解:原理、优化与实战应用
  • HarmonyOS6 RcButton 组件核心架构与设计思想解析
  • 一种光伏产品缺陷检测 AI 深度学习算法
  • Python 副业实战:爬虫技术与接单指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

目录

  1. 昇腾 Ascend C 编程指南:从语法基础到算子开发实战
  2. Ascend C 算子是什么
  3. Ascend C 编程模型
  4. Ascend C 硬件架构抽象与编程范式
  5. Ascend C API 体系:基础与高层 API 的分层赋能
  6. 基础 API:底层能力的灵活拼接
  7. 高层 API:上层算法的高效封装
  8. 基于 Kernel 直调工程的算子开发
  9. 核函数定义
  10. 算子类实现
  11. Init 实现
  12. Process() 实现
  13. 主机侧 main.cpp
  14. 数据生成脚本 gen_data.py
  15. 简单工程执行
  • 💰 8折买阿里云服务器限时8折了解详情