创建算子工程
======

DDK开发套件包中提供了自定义算子工程生成工具msOpGen，可基于算子原型定义输出算子工程：包括**算子host侧代码实现文件**、**算子kernel侧实现文件**以及**工程编译配置文件等**。

**简要说明：**

使用msOpGen工具创建算子工程之前，需要参考[环境准备](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/cannkit-environment-preparation)章节安装驱动固件和DDK软件包，完成开发环境和运行环境的准备。

同时需要配置ascendc环境变量，示例如下。

source ddk/tools/tools\_ascendc/set\_ascendc\_env.sh

使用msOpGen工具创建算子开发工程的步骤如下。

1.  编写算子的原型定义json文件，用于生成算子开发工程。
    
    例如，AddCustom算子的json文件命名为add\_custom.json，文件内容如下。
    
    \[
        {
            "op": "AddCustom",
            "input\_desc": \[
                {
                    "name": "x",
                    "param\_type": "required",
                    "format": \[
                        "ND",
                        "ND",
                        "ND"
                    \],
                    "type": \[
                        "fp16",
                        "float",
                        "int32"
                    \]
                },
                {
                    "name": "y",
                    "param\_type": "required",
                    "format": \[
                        "ND",
                        "ND",
                        "ND"
                    \],
                    "type": \[
                        "fp16",
                        "float",
                        "int32"
                    \]
                }
            \],
            "output\_desc": \[
                {
                    "name": "z",
                    "param\_type": "required",
                    "format": \[
                        "ND",
                        "ND",
                        "ND"
                    \],
                    "type": \[
                        "fp16",
                        "float",
                        "int32"
                    \]
                }
            \]
        }
    \]
    
    例如，ReduceMaxCustom算子（包含属性）的json文件命名为reduce\_max\_custom.json，文件内容如下。
    
    \[
        {
            "op": "ReduceMaxCustom",
             "input\_desc": \[
                {
                    "name": "x",
                    "param\_type": "required",
                    "format": \["ND"\],
                    "type": \["float16"\]
                }
            \],
            "output\_desc": \[
                {
                    "name": "y",
                    "param\_type": "required",
                    "format": \["ND"\],
                    "type": \["float16"\]
                },
                {
                    "name": "idx",
                    "param\_type": "required",
                    "format": \["ND"\],
                    "type": \["int32"\]
                }
            \],
            "attr": \[
                {
                    "name": "reduceDim",
                    "param\_type": "required",
                    "type": "int"
                },
                {
                    "name": "isKeepDim",
                    "param\_type": "optional",
                    "type": "int",
                    "default\_value": 1
                }
            \]
        }
    \]
    
2.  使用msOpGen工具生成算子的开发工程。以生成AddCustom的算子工程为例，下文仅针对关键参数进行解释，详细参数说明请参见[算子工程创建工具参数说明](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/cannkit-creating-operator-project-msopgen)。
    
    msopgen gen -i ./add\_custom.json -c ai\_core-kirin9020 -f ONNX -out ./AddCustom
    
    *   \-i：指定算子原型定义文件add\_custom.json所在路径，请根据实际情况修改。
    *   \-c：ai\_core-<soc\_version>代表算子在AI Core上执行，<soc\_version>为AI处理器的型号，当前支持ai\_core-kirin9020、ai\_core-kirinX90。
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/d2/v3/abobGK6ZR9yr6Xo9bQvNdg/note_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260612T073658Z&HW-CC-Expire=86400&HW-CC-Sign=1C4626B793C2AFF3D7EC2799F5B7CB815C6B58BC5399FC1466CA94B6EE81F8F6)
    
    AI处理器的型号<soc\_version>请在运行环境上通过命令行获取：
    
    hdc -t {target} shell param get ohos.boot.chiptype
    
    target：设备的SN码，可以通过hdc list targets获取当前环境上所有设备的SN码。
    
    *   \-f：第三方算子平台，目前支持TF、ONNX。
    *   \-out：生成文件所在路径，可配置为绝对路径或者相对路径，并且工具执行开发者对路径具有可读写权限。若不配置，则默认生成在执行命令的当前路径。
3.  命令执行完后，会在-out指定目录或者默认路径下生成算子工程目录，工程中包含算子实现的模板文件，编译脚本等，以AddCustom算子为例，目录结构如下所示：
    
    AddCustom
    ├── build\_devices.sh // 编译kernel动态库入口脚本
    ├── build.sh // 编译入口脚本
    ├── cmake
    │   ├── config.cmake
    │   ├── func.cmake
    │   ├── intf.cmake
    │   ├── makeself.cmake
    │   └── util // 算子工程编译所需脚本及公共编译文件存放目录
    ├── CMakeLists.txt // 算子工程的CMakeLists.txt
    ├── CMakePresets.json // 编译配置项
    ├── framework // 算子插件实现文件目录，单算子模型文件的生成不依赖算子适配插件，无需关注
    ├── op\_host // host侧实现文件
    │   ├── \*\*add\_custom\_tiling.h\*\* // 算子tiling定义文件
    │   ├── \*\*add\_custom.cpp\*\* // 算子原型注册、shape推导、信息库、tiling实现等内容文件
    │   ├── CMakeLists.txt
    ├── op\_kernel // kernel侧实现文件
    │   ├── CMakeLists.txt
    │   ├── \*\*add\_custom.cpp\*\* // 算子代码实现文件
    └── scripts // 自定义算子工程打包相关脚本所在目录
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/3f/v3/H1NkP2eDQIeS-_fE5si7LA/note_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260612T073658Z&HW-CC-Expire=86400&HW-CC-Sign=AFBDBE507B6CCD5E151948647BDB2D8FFAEE78810C88A9B3F2ED68A324DAEB31)
    
    上述目录结构中的粗体文件为后续算子开发过程中需要修改的文件，其他文件无需修改。
    

工程目录中的op\_kernel和op\_host包含了算子的核心实现文件。op\_kernel下存放[Kernel侧算子实现](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/cannkit-operator-implementation-on-the)。op\_host下存放host侧代码实现，包括[算子原型定义实现](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/cannkit-operator-prototype-definition)、[Host侧Tiling实现](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/cannkit-tiling-implementation-on-the-host)。其中kernel侧算子实现和host侧tiling实现在[算子实现](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/cannkit-operator-implementation-overview)章节已经介绍了其核心的实现方法，在该章节会侧重于介绍接入DDK框架后的编程模式和API的使用。工程目录中的CMakePresets.json，用于开发者完成工程编译相关配置，之后即可进行编译部署。