昇腾社区首页
中文
注册

算子原型注册

算子原型主要描述了算子的输入输出、属性等信息以及算子在AI处理器上相关实现信息,并关联上述Tiling实现、Shape推导等函数。下面是一个简单的Add算子原型注册的例子。

namespace ops {
class AddCustom : public OpDef {
public:
    AddCustom(const char* name) : OpDef(name)
    {
        this->Input("x")
            .ParamType(REQUIRED)
            .DataType({ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_INT32})
            .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND})
            .UnknownShapeFormat({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND});
        this->Input("y")
            .ParamType(REQUIRED)
            .DataType({ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_INT32})
            .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND})
            .UnknownShapeFormat({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND});
        this->Output("z")
            .ParamType(REQUIRED)
            .DataType({ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_INT32})
            .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND})
            .UnknownShapeFormat({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND});
        this->SetInferShape(ge::InferShape);
        this->AICore()
            .SetTiling(optiling::TilingFunc);
        // 请替换为实际的昇腾AI处理器型号
        this->AICore().AddConfig("ascendxxx");
    }
};
OP_ADD(AddCustom);
} // namespace ops

算子原型定义

算子原型定义描述了算子的输入输出,属性等信息。

如下的代码片段呈现了Add算子输入x的描述信息。

        this->Input("x")
            .ParamType(REQUIRED)
            .DataType({ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_INT32})
            .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND})
            .UnknownShapeFormat({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND});

如下的代码片段呈现了ReduceMax算子的属性reduceDim和isKeepDim的描述信息。

        this->Attr("reduceDim")
            .AttrType(REQUIRED)
            .Int();
        this->Attr("isKeepDim")
            .AttrType(OPTIONAL)
            .Int(1);

具体参数说明如下:

表1 原型定义的具体参数说明

原型定义

注册方式

具体描述

Input/Ouput

ParamType

参数类型,Option取值为:OPTIONAL(可选)、REQUIRED(必选)、DYNAMIC(动态输入)。

  • 类似于上文中的Add样例,其输入输出是必选的。
  • 有些算子的输入或者输出个数是动态的,例如AddN,将N个输入Tensor累加到一起,输出一个Tensor;SplitV,将一个Tensor在某个轴上,拆分为N个Tensor输出。
  • 有些算子的输入是可选的,例如BatchNorm算子,在训练的时候没有均值和方差输入,在推理的时候有均值和方差的输入。

DataType

算子输入输出支持的数据类型。数据类型的取值请参考ge:DataType

Format

算子输入输出支持的格式。格式的取值请参考ge::Format

Attr

AttrType

设置算子属性类型,取值为:OPTIONAL(可选)、REQUIRED(必选)。

Bool/Float/Int...

设置算子属性数据类型为Bool/Float/Int...。具体说明请参考OpAttrDef类

AI处理器上相关实现信息

通过AddConfig注册算子支持的AI处理器型号以及相关的配置信息。AddConfig接口原型如下:soc参数表示AI处理器型号,aicore_config表示其他配置信息。

void AddConfig(const char *soc);
void AddConfig(const char *soc, OpAICoreConfig &aicore_config);

通过该接口注册AI 处理器型号的样例如下,ascendxxx请替换为实际的AI处理器型号。

        this->AICore().AddConfig("ascendxxx");

其他AI Core配置信息的配置方式请参考OpAICoreConfig

关联Tiling实现、Shape推导等函数

通过SetInferShapeSetTiling接口来关联对应的shape推导函数和Tiling函数,样例如下。

        this->SetInferShape(ge::InferShape);
        this->AICore()
            .SetTiling(optiling::TilingFunc);