Ascend C 算子工程从 0 到 1 搭建:工具使用与模块拆解
需提前编写算子原型文件(如),明确输入输出张量的参数信息,示例如下:json},],
·
Ascend C 算子开发依赖标准化的工程结构,通过mgcGcn工具可快速生成规范的工程框架,降低开发门槛。本文详细讲解算子工程的创建流程、模块组成及核心文件功能,助力开发者快速搭建开发环境。
一、工程创建前准备
(一)环境配置
- 安装 CANN 开发套件:确保
ascend-toolkit已安装,版本≥7.0,通过以下命令验证:
bash
echo $ASCEND_CANN_PACKAGE_PATH
# 输出示例:/usr/local/Ascend/ascend-toolkit/latest
- 安装 mgcGcn 工具:该工具是 Ascend C 算子工程生成的核心工具,随 CANN 开发套件一同安装,可通过
mgcGcn --version验证可用性。
(二)算子原型定义
需提前编写算子原型文件(如add_custom.json),明确输入输出张量的参数信息,示例如下:
json
{
"opName": "AddCustom",
"inputDesc": [
{
"name": "A",
"dtype": "float32",
"format": "NHWC",
"shape": ["N", "C", "H", "W"]
},
{
"name": "B",
"dtype": "float32",
"format": "NHWC",
"shape": ["N", "C", "H", "W"]
}
],
"outputDesc": [
{
"name": "C",
"dtype": "float32",
"format": "NHWC",
"shape": ["N", "C", "H", "W"]
}
]
}
二、算子工程创建流程
(一)执行创建命令
通过mgcGcn工具生成工程,命令格式如下:
bash
mgcGcn add -i [原型文件路径] -c [核心类型] -o [输出目录] [算子名称]
示例命令:
bash
mgcGcn add -i add_custom.json -c core ascendclan -o out AddCustom
-i:指定算子原型文件路径。-c:核心类型(core表示基础算子)。-o:工程输出目录。- 最后参数:算子名称(需与原型文件中
opName一致)。
(二)工程目录结构
生成的工程目录out/AddCustom结构如下:
plaintext
AddCustom/
├── CMakeLists.txt # 编译配置文件
├── CMakePresets.json # 预设编译配置
├── build.sh # 编译脚本
├── src/
│ ├── host/ # Host侧代码目录
│ │ ├── add_custom.cpp # 业务逻辑代码(Tiling、Shape推导)
│ │ ├── add_custom_tiling.h # Tiling结构体定义
│ │ └── add_custom_registry.h # 算子注册头文件
│ └── device/ # Device侧代码目录
│ └── add_custom_kernel.cpp # Kernel核函数实现
└── test/ # 测试用例目录
└── test_add_custom.py # ST测试用例
三、核心模块拆解
(一)编译配置模块(CMakeLists.txt/CMakePresets.json)
- CMakeLists.txt:定义编译规则,核心配置如下:
cmake
# 指定C++标准
set(CMAKE_CXX_STANDARD 17)
# 引入CANN开发套件依赖
include_directories(${ASCEND_CANN_PACKAGE_PATH}/include)
link_directories(${ASCEND_CANN_PACKAGE_PATH}/lib64)
# 定义算子库目标
add_library(custom_opp SHARED src/host/add_custom.cpp src/device/add_custom_kernel.cpp)
# 链接依赖库
target_link_libraries(custom_opp ascendcl ge_compiler)
- CMakePresets.json:预设编译参数,如编译类型(Debug/Release)、架构(x86_64/arm64)等。
(二)Host 侧模块
- Tiling 模块:
add_custom_tiling.h定义分块结构体,add_custom.cpp实现分块逻辑。 - Shape 推导模块:通过
GetInputDesc、GetShape等 API 推导输入输出张量属性,确保计算正确性。 - 算子注册模块:通过宏定义
REG_OP(AddCustom)将算子注册至系统,支持 AscendCL API 调用。
(三)Device 侧模块
add_custom_kernel.cpp实现 Kernel 核函数,包含向量 / 矩阵计算逻辑,通过 Ascend C 扩展指令(如vdadd、mmul)实现并行计算。
(四)测试模块
test_add_custom.py编写 ST 测试用例,通过pytest执行,验证算子在不同输入场景下的功能正确性。
四、工程使用流程
- 修改核心代码:在
src/host和src/device目录下完善 Tiling 逻辑、Kernel 计算逻辑。 - 编译工程:执行
build.sh脚本,生成算子包custom_opp.so(位于build_out目录)。 - 测试验证:运行
test_add_custom.py,验证算子功能。 - 部署算子:执行部署脚本,将算子包安装至 OP 库目录。
训练营简介:
2025年昇腾CANN训练营第二季,基于CANN开源开放全场景,推出0基础入门系列、码力全开特辑、开发者案例等专题课程,助力不同阶段开发者快速提升算子开发技能。获得Ascend C算子中级认证,即可领取精美证书,完成社区任务更有机会赢取华为手机,平板、开发板等大奖。
报名链接:
https://www.hiascend.com/developer/activities/cann20252?tab=overview
更多推荐
所有评论(0)