【昇腾CANN训练营·生态篇】端云一体:Ascend C 算子在鸿蒙系统上的交叉编译与部署
2025年昇腾CANN训练营第二季推出系列课程,助力开发者提升算子开发技能,完成认证可获证书及大奖。文章重点讲解如何实现"一次编写,端侧运行"的交叉编译技术:通过搭建OpenHarmony SDK和昇腾ACL库(ARM版)工具链,配置CMake进行交叉编译生成ARM架构可执行文件,并使用HDC工具部署到鸿蒙设备运行。同时指出端侧开发需注意内存池化、静态Shape等资源约束问题,
训练营简介
2025年昇腾CANN训练营第二季,基于CANN开源开放全场景,推出0基础入门系列、码力全开特辑、开发者案例等专题课程,助力不同阶段开发者快速提升算子开发技能。获得Ascend C算子中级认证,即可领取精美证书,完成社区任务更有机会赢取华为手机,平板、开发板等大奖。
报名链接:https://www.hiascend.com/developer/activities/cann20252#cann-camp-2502-intro

前言
“万物互联,智在端侧。”
在昇腾的生态版图中,端云协同是重要的一环。我们在云端(Ascend 910)训练好的大模型,最终往往需要量化剪枝后,运行在边缘设备(Ascend 310B / Nano)上。
而 OpenHarmony 作为面向万物互联的操作系统,与昇腾 NPU 的结合(如 Orange Pi AIpro 开发板)正在成为 AIoT 开发的新范式。
但在端侧跑算子,最头疼的就是环境不一致:你的代码是在 PC 上写的,但要跑在 ARM 架构的板子上。这就涉及到交叉编译。本期文章将带你跨越架构的鸿沟,实现“一次编写,端侧运行”。
一、 核心图解:跨越架构的桥梁
PC 是 x86 架构,端侧是 ARM 架构。它们就像讲不同语言的两个人。 交叉编译器(Cross Compiler) 就是翻译官,它运行在 x86 上,但能生成 ARM 能听懂的二进制指令。

二、 环境准备:搭建交叉编译工具链
要进行 OpenHarmony 开发,我们需要 SDK 和 NPU 驱动包。
2.1 获取 SDK
下载 OpenHarmony SDK(包含 Native C++ 工具链)。 核心工具是 clang / clang++,它们被配置为目标架构是 aarch64-linux-ohos。
2.2 获取昇腾 ACL 库 (ARM版)
这是最容易出错的一步。 注意:你不能链接 PC 上的 /usr/local/Ascend 库,因为那是 x86 的。 你需要下载 Ascend-cann-toolkit_linux-aarch64.run,并提取其中的 runtime/lib64 和 include 目录,作为编译时的依赖。
三、 实战:配置 CMake 进行交叉编译
假设我们要部署一个调用 AddCustom 算子的 C++ 推理应用。
3.1 编写 CMakeLists.txt
我们需要告诉 CMake:别用本地的 GCC,用鸿蒙的 Clang!
# toolchain.cmake (工具链配置文件)
set(CMAKE_SYSTEM_NAME OHOS)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
# 指定编译器路径 (指向 OHOS SDK)
set(CMAKE_C_COMPILER ${OHOS_SDK}/native/llvm/bin/clang)
set(CMAKE_CXX_COMPILER ${OHOS_SDK}/native/llvm/bin/clang++)
# 指定 Sysroot (头文件和库的基础路径)
set(CMAKE_SYSROOT ${OHOS_SDK}/native/sysroot)
主 CMakeLists.txt:
cmake_minimum_required(VERSION 3.10)
project(OhosAscendApp)
# 1. 包含 Ascend 头文件 (ARM版)
include_directories(${ASCEND_ARM_LIBS}/include)
# 2. 链接 Ascend 库 (ARM版)
link_directories(${ASCEND_ARM_LIBS}/lib64)
add_executable(main main.cpp)
# 3. 链接 ACL 库
# 注意:OpenHarmony 上通常链接 libascendcl.so
target_link_libraries(main ascendcl acl_dvpp stdc++)
3.2 编译指令
mkdir build && cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake
make -j
编译成功后,你会得到一个 ARM 架构的可执行文件 main。可以通过 file main 命令确认: main: ELF 64-bit LSB executable, ARM aarch64
四、 部署与运行:HDC 的妙用
OpenHarmony 使用 HDC (HarmonyOS Device Connector) 工具进行设备管理(类似 Android 的 ADB)。
4.1 推送文件
将编译好的 main 和转换好的算子模型 .om 推送到板子上。
# 1. 推送可执行文件
hdc file send ./main /data/local/tmp/
# 2. 推送模型文件
hdc file send ./model_add.om /data/local/tmp/
# 3. 赋予执行权限
hdc shell "chmod +x /data/local/tmp/main"
4.2 运行与调试
# 进入设备 Shell
hdc shell
# 设置库路径 (如果 ACL 库不在系统默认路径)
export LD_LIBRARY_PATH=/usr/lib64:/data/local/tmp/libs:$LD_LIBRARY_PATH
# 运行
cd /data/local/tmp
./main
如果看到 [INFO] Execute Success!,恭喜你,你的 Ascend C 算子已经在鸿蒙设备上跑起来了!
五、 端侧开发的特殊约束
在端侧(如 Ascend 310B),资源非常紧张,代码习惯要改改:
-
内存池化:端侧系统内存(OS Memory)和 NPU 内存往往是共享物理内存(Unified Memory)。尽量复用 Buffer,避免频繁
malloc/free造成碎片。 -
静态 Shape:端侧推理强烈建议使用 Static Shape。动态 Shape 会导致运行时的 Tiling 计算和 workspace 申请,增加时延抖动。
-
ACL Lite:如果是极简应用,可以考虑使用 ACL Lite 库,它是对标准 ACL 的封装,代码量更少,更适合嵌入式开发。
六、 总结
端云一体是 AI 的未来形态。
-
开发:在 x86 服务器上使用 MindStudio 开发和仿真。
-
编译:使用交叉编译工具链生成 ARM 二进制。
-
部署:通过 HDC 推送到 OpenHarmony 设备运行。
掌握了这一套流程,你就打通了从云端算法到边缘硬件的任督二脉。你的算子将不再局限于机房,而是能深入到千行百业的智能终端中。
更多推荐

所有评论(0)