昇腾社区首页
中文
注册

DataTypeForBinQuery

函数功能

设置Input/Output用于运行时算子二进制查找的数据类型,和DataType/DataTypeList的数量一致,且一一对应。

算子编译过程中,会根据数据类型生成多个.o,并通过这些数据类型在运行时索引算子二进制。某些算子支持多种数据类型,且对数据类型不敏感,这时可以使用该接口,将多种数据类型映射到同一个算子二进制,多个数据类型可以复用一个.o,从而减少二进制文件的生成。

例如,如果一个算子的输入支持多种数据类型(ge::DT_INT16 和ge::DT_INT32),并且使用ge::DT_INT16 输入时可以复用ge::DT_INT32 的二进制文件而不影响最终结果,那么可以采用如下配置:

1
2
3
4
5
this->Input("x")
    .ParamType(REQUIRED)
    .DataType({ge::DT_INT16, ge::DT_INT32})
    .DataTypeForBinQuery({ge::DT_INT32, ge::DT_INT32})
    .Format({ge::FORMAT_ND, ge::FORMAT_ND});

这样,只需生成一个目标文件(.o),就能实现对多种数据类型的支持。

函数原型

OpParamDef &DataTypeForBinQuery(std::vector<ge::DataType> types);

参数说明

参数

输入/输出

说明

types

输入

算子参数数据类型,ge::DataType请参考DataType

返回值说明

OpParamDef算子定义,OpParamDef请参考OpParamDef

约束说明

  • DataTypeForBinQuery的参数长度需要和DataType或者DataTypeList保持一致。
  • 不支持与To(指定数据类型)的接口同时使用。
  • 设置DataTypeForBinQuery后,会用DataTypeForBinQuery的数据类型替换当前Input/Output的数据类型,并检查新组合在替换前是否存在。如果存在,则指向对应的二进制,如果不存在,该参数失效,按照原来的数据类型生成。具体请参考示例一

调用示例

  • 示例一
            this->Input("x")
                .ParamType(REQUIRED)
                .DataType({ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_INT16, ge::DT_INT32})
                .DataTypeForBinQuery({ge::DT_INT16, ge::DT_FLOAT16, ge::DT_FLOAT16, ge::DT_INT16})
                .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND});
            this->Output("y")
                .ParamType(REQUIRED)
                .DataType({ge::DT_INT16, ge::DT_INT16, ge::DT_INT16, ge::DT_INT16})
                .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_NC});

    如下图所示,没有设置DataTypeForBinQuery之前,会生成4个二进制。通过上述代码设置DataTypeForBinQuery后:

    • 替换后第1列使用原来第3列的二进制,第2列和第3列使用原来第1列的二进制。第4列仍使用第4列的二进制。
    • 替换后,第2列和第3列完全一致,达成二进制复用的效果,算子总二进制会由原来的四个(bin1,bin2,bin3,bin4)缩减至现在的三个(bin1,bin3、bin4)。

  • 示例二
    // 简单用例,此时会有两对复用,1、4列->3列,2、3列->1列。总共生成1、3两个二进制。所有支持的DataType会传入这两个二进制运行。
            this->Input("x")
                .ParamType(REQUIRED)
                .DataType({ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_INT16, ge::DT_INT32})
                .DataTypeForBinQuery({ge::DT_INT16, ge::DT_FLOAT16, ge::DT_FLOAT16, ge::DT_INT16})
                .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND});
            this->Output("y")
                .ParamType(REQUIRED)
                .DataType({ge::DT_FLOAT, ge::DT_FLOAT, ge::DT_FLOAT, ge::DT_FLOAT})
                .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND});
  • 示例三
    // 复杂用例,可以多个Input/Output同时使用DataTypeForBinQuery,此时也会产生两对复用。1、2列->2列,3、4列->1列。总共生成1、2两个二进制。所有支持的DataType会传入这两个二进制运行。
            this->Input("x")
                .ParamType(REQUIRED)
                .DataType({ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_INT16, ge::DT_INT32})
                .DataTypeForBinQuery({ge::DT_FLOAT, ge::DT_FLOAT, ge::DT_FLOAT16, ge::DT_FLOAT16})
                .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND});
            this->Input("y")
                .ParamType(REQUIRED)
                .DataType({ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_INT32, ge::DT_INT16})
                .DataTypeForBinQuery({ge::DT_FLOAT, ge::DT_FLOAT, ge::DT_FLOAT16, ge::DT_FLOAT16})
                .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND});
            this->Output("z")
                .ParamType(REQUIRED)
                .DataType({ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_INT32, ge::DT_INT16})
                .DataTypeForBinQuery({ge::DT_FLOAT, ge::DT_FLOAT, ge::DT_FLOAT16, ge::DT_FLOAT16})
                .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND});