C++ 怎么使用 Ascend C 编程语言在华为昇腾(Ascend NPU)上开发自定义算子

小涛大大_3047

小涛大大_3047

2026-10-26

690人浏览

原创

ascend c不是独立编程语言,而是华为基于c++的扩展语法库,通过头文件、编译器插件(ascendcc)和专用attribute/intrinsics实现,仅用于昇腾npu设备侧算子开发,必须与acl host侧代码协同使用。

c++ 怎么使用 ascend c 编程语言在华为昇腾(ascend npu)上开发自定义算子

Ascend C 不是独立编程语言,而是华为提供的 C++ 扩展语法库

很多人搜“Ascend C 编程语言”,误以为它是像 Rust 或 Go 那样的新语言——其实它只是华为在 C++ 基础上封装的一套头文件 + 编译器插件(akg + inc 工具链),所有代码仍需写成合法 C++,并用 ascendcc 编译器(本质是 clang 衍生版)处理特定 attribute 和 intrinsics。

这意味着你不能直接写 main() 运行 Ascend C 代码,也不能脱离昇腾驱动和 CANN 软件栈单独部署。真实开发流程是:写一个符合算子接口规范的 C++ 函数 → 加 __aicore__ attribute 标记 → 用 ascendcc 编译成 .o → 通过 op_compiler 打包为 .so → 注册进 PyTorch/TensorFlow 插件中调用。

常见错误现象:error: unknown attribute '__aicore__' —— 说明没用 ascendcc 编译,或环境变量 ASCEND_TOOLKIT_HOME 没设对;undefined reference to 'aclrtMemcpy' —— 混淆了 Host 侧(CPU)和 Device 侧(NPU)代码,Ascend C 只负责 Device 侧 kernel,内存拷贝、流同步等必须由 Host 侧 C++/Python 完成。

算子开发必须严格遵循 TBE/ACL 双层结构

昇腾平台把算子拆成两部分:TBE(Tensor Boost Engine)负责 Device 侧计算逻辑(用 Ascend C 写),ACL(Ascend Computing Language)负责 Host 侧调度(用 C++/Python 写)。两者不能混写,也不能省略任一环节。

典型结构如下:

// device_kernel.cpp(Ascend C,必须用 ascendcc 编译)
__aicore__ void MyAddKernel(__gm__ half* x, __gm__ half* y, __gm__ half* z, int n) {
    // 使用 cube、vector 等专用 intrinsics
}

对应 Host 侧要写:

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
// host_op.cpp(标准 g++ 编译)
#include "acl/acl.h"
extern "C" aclError aclnnMyAddWorkspaceSize(...) { ... }
extern "C" aclError aclnnMyAdd(...); // 调用 device kernel

关键点:

  • __gm__ 指向 global memory(DDR),__l1__/__l0__ 才是片上缓存,不显式声明会默认走最慢路径
  • 所有 tensor shape、stride、dtype 必须通过 ACL 接口传入,Ascend C kernel 内不可硬编码尺寸
  • kernel 启动参数不能超过 6 个(含指针+标量),超限需打包进 __aicore__ struct
  • 不支持动态分支(如 if (x[i] > 0) 在 vector 模式下会触发 scalar fallback,性能暴跌)

调试 Ascend C kernel 的实际路径只有两条

没有传统意义上的单步调试器。你看到的 printf、assert、gdb 全部无效——NPU 上无法运行 libc 或符号表。真实可用的调试手段只剩:

  • 用 ascendcc -O0 --debug 编译,生成带 debug info 的 .o,再通过 op_tester 工具注入 mock 数据,观察输出 tensor 是否匹配预期
  • 在 Host 侧插入 aclrtSynchronizeStream + aclrtMemcpy 回拷中间 buffer,用 np.allclose() 校验每一段计算结果(例如只验证 L1 Load 阶段输出是否正确)
  • 禁用所有优化(-O0)、关闭向量化(--disable-vectorize),先让 scalar 版本跑通,再逐步打开 --enable-vectorize 和 --enable-cube

容易踩的坑:op_tester 默认使用 float32,但你的 kernel 是 half,必须显式指定 --input-dtype=half,否则数据被截断后根本看不出逻辑错在哪。

编译产物必须通过 op_compiler 打包,不能直接 dlopen

Ascend C 编译出的 .o 文件不是 ELF 共享库,不能用 dlopen() 加载。必须用华为提供的 op_compiler 工具将其与 JSON 描述文件(op_info.json)一起打包为 libxxx.so,且该 so 中必须导出固定符号:

  • aclnnMyAddWorkspaceSize
  • aclnnMyAdd
  • GetOpImplyType

否则在 PyTorch 调用时会报 OP registration failed: symbol not found。JSON 文件里 inputFormat、outputFormat 必须与实际 tensor layout 一致(比如 NCHW 对应 ND,NHWC 对应 NHWC),填错会导致 shape 解析失败,但错误信息只会显示 invalid param,无具体字段提示。

真正难的是多维度对齐:Host 侧申请的 buffer size、kernel 内 __gm__ 指针偏移、JSON 里描述的 tensor stride、以及 PyTorch autograd 需要的 backward kernel 输入输出顺序——这四者只要有一处差一个字节,就会静默出错,输出全零或 NaN。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关专题

更多
编程语言有哪些
编程语言有哪些

编程语言有C语言、C++语言、Java语言、Python语言、JavaScript语言、Ruby语言、Go语言等。本专题为大家提供编程语言相关的各种文章、以及下载和课程。

2023.08.11

1112

5

html转换txt文本格式方法
html转换txt文本格式方法

html通过使用在线工具、离线工具和编程语言来转txt。更多关于html转换txt文本格式方法详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.01

3835

8

c语言是什么编程语言
c语言是什么编程语言

c语言作为一种通用、结构化的编程语言,自诞生以来广泛应用于计算机领域。其基本特性包括结构化编程、过程式编程、底层访问能力、高效性能和跨平台性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

820

5

如何挑选适合初学者的编程语言
如何挑选适合初学者的编程语言

编程语言选择至关重要,它直接影响学习效率和职业发展。初学者选择易于入门且应用广泛的语言,能为未来的深造和职业规划奠定基础。选择不当可能导致学习曲线陡峭、应用范围狭窄、就业机会有限,甚至难以拓展其他领域。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2025.01.24

482

4

编程语言排行榜2025
编程语言排行榜2025

本专题文章深入分析2025年最新的编程语言流行度排名,基于TIOBE指数等权威数据,揭示Python、C++、Java等主流语言的最新动态与市场份额变化。通过对比各语言的优缺点、应用场景及就业前景,为开发者提供选择学习方向的实用参考,同时展望编程语言在人工智能、大数据和云计算等前沿技术中的未来发展。想了解更多详细内容,请阅读专题下面的文章。

2025.07.29

4867

27

java基础知识学习
java基础知识学习

本专题文章旨在为Java语言初学者提供系统化的学习路径,涵盖Java编程的核心基础知识、实用代码示例及全面的知识点总结。本专题适合零基础学习者及希望巩固Java基础的开发者,通过理论与实践结合,快速入门并迈向进阶开发。

2025.08.01

4584

26

2026 年编程语言排行榜与趋势解读
2026 年编程语言排行榜与趋势解读

本专题整合了编程语言排行榜合集,阅读专题下面的文章了解更多详细内容。

2026.05.29

20895

17

零基础编程语言选择与学习路线
零基础编程语言选择与学习路线

面向编程零基础用户与转行人群,系统分析不同编程语言的学习曲线、适用场景与就业前景,涵盖 Python(数据分析/AI/自动化/爬虫)、JavaScript/TypeScript(前端/全栈/小程序)、Java(企业后端/Android/大数据)、Go(云原生/微服务/DevOps)、C/C++(系统底层/嵌入式/游戏引擎)的定位对比与人群匹配建议、各语言从入门到实战的分阶段学习路线图、优质学习资源推荐(官方文档/在线课程/开源项目)、自

2026.05.29

804

20

c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.14

2248

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Rust 教程
Rust 教程

共28课时 | 12万人学习

Kotlin 教程
Kotlin 教程

共23课时 | 9.5万人学习