Ascend C 算子开发依赖标准化的工程结构,通过mgcGcn工具可快速生成规范的工程框架,降低开发门槛。本文详细讲解算子工程的创建流程、模块组成及核心文件功能,助力开发者快速搭建开发环境。

一、工程创建前准备

(一)环境配置

  1. 安装 CANN 开发套件:确保ascend-toolkit已安装,版本≥7.0,通过以下命令验证:

bash

echo $ASCEND_CANN_PACKAGE_PATH
# 输出示例:/usr/local/Ascend/ascend-toolkit/latest
  1. 安装 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)

  1. 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)
  1. CMakePresets.json:预设编译参数,如编译类型(Debug/Release)、架构(x86_64/arm64)等。

(二)Host 侧模块

  1. Tiling 模块add_custom_tiling.h定义分块结构体,add_custom.cpp实现分块逻辑。
  2. Shape 推导模块:通过GetInputDescGetShape等 API 推导输入输出张量属性,确保计算正确性。
  3. 算子注册模块:通过宏定义REG_OP(AddCustom)将算子注册至系统,支持 AscendCL API 调用。

(三)Device 侧模块

add_custom_kernel.cpp实现 Kernel 核函数,包含向量 / 矩阵计算逻辑,通过 Ascend C 扩展指令(如vdaddmmul)实现并行计算。

(四)测试模块

test_add_custom.py编写 ST 测试用例,通过pytest执行,验证算子在不同输入场景下的功能正确性。

四、工程使用流程

  1. 修改核心代码:在src/hostsrc/device目录下完善 Tiling 逻辑、Kernel 计算逻辑。
  2. 编译工程:执行build.sh脚本,生成算子包custom_opp.so(位于build_out目录)。
  3. 测试验证:运行test_add_custom.py,验证算子功能。
  4. 部署算子:执行部署脚本,将算子包安装至 OP 库目录。

    训练营简介:

    2025年昇腾CANN训练营第二季,基于CANN开源开放全场景,推出0基础入门系列、码力全开特辑、开发者案例等专题课程,助力不同阶段开发者快速提升算子开发技能。获得Ascend C算子中级认证,即可领取精美证书,完成社区任务更有机会赢取华为手机,平板、开发板等大奖

    报名链接:

    https://www.hiascend.com/developer/activities/cann20252?tab=overview

Logo

CANN开发者社区旨在汇聚广大开发者,围绕CANN架构重构、算子开发、部署应用优化等核心方向,展开深度交流与思想碰撞,携手共同促进CANN开放生态突破!

更多推荐