TilingData结构注册
==============

#### 函数功能

注册定义的TilingData结构体并和自定义算子绑定。具体使用说明请参考[调用示例](#调用示例)。

#### 函数原型

REGISTER\_TILING\_DATA\_CLASS(op\_type, class\_name)
#define REGISTER\_TILING\_DATA\_CLASS(op\_type, class\_name)
  class op\_type##class\_name##Helper {
  public:
    op\_type##class\_name##Helper() {
      CTilingDataClassFactory::RegisterTilingData(#op\_type, op\_type##class\_name##Helper::CreateTilingDataInstance);
    }
    static std::shared\_ptr<TilingDef> CreateTilingDataInstance() {
      return std::make\_shared<class\_name>();
    }
  };
  op\_type##class\_name##Helper g\_tilingdata\_##op\_type##class\_name##helper;

#### 参数说明

**表1** 参数说明

| 参数 | 输入/输出 | 说明 |
| :-- | :-- | :-- |
| op\_type | 输入 | 注册的算子名。 |
| class\_name | 输入 | tiling结构体名，与c++变量命名要求一致。 |

#### 约束说明

*   使用时需要包含头文件register/tilingdata\_base.h。
    
*   中间结构体和定制tilingkey结构体需注意op\_type命名规则，具体见[调用示例](#调用示例)。
    
*   算子定制tilingkey结构体需保证必须注册op\_type默认结构体。
    
*   tiling结构体是全局属性，需注意应通过结构体名作为全局唯一标记，不同算子若注册同名不同结构tiling结构体则会发生未定义行为。
    

#### 调用示例

*   注册算子Tiling结构体
    
    #include "register/tilingdata\_base.h"
    
    // 定义tilingdata类
    namespace optiling {
    BEGIN\_TILING\_DATA\_DEF(AddCustomTilingData) // 注册一个tiling的类，以tiling的名字作为入参
      TILING\_DATA\_FIELD\_DEF(uint32\_t, blkDim); // 添加tiling字段，参与计算核数
      TILING\_DATA\_FIELD\_DEF(uint32\_t, totalSize); // 添加tiling字段，总计算数据量-输入shape大小
      TILING\_DATA\_FIELD\_DEF(uint32\_t, splitTile); // 添加tiling字段，每个core处理的数据分块计算
    END\_TILING\_DATA\_DEF; // 定义结束
    // 注册算子tilingdata类到对应的AddCustom算子
    REGISTER\_TILING\_DATA\_CLASS(AddCustom, AddCustomTilingData)
    }
    
*   注册中间结构体。当开发者有结构体嵌套场景时，嵌套的结构体称为中间结构体。因为一个算子名只能注册一个Tiling结构体，为使得框架能够检测中间结构体信息，需要构造"虚拟算子名"（结构体名+Op）并通过REGISTER\_TILING\_DATA\_CLASS接口注册中间结构体，注册方式如下。
    
    BEGIN\_TILING\_DATA\_DEF(Matmul)
      TILING\_DATA\_FIELD\_DEF(uint16\_t, mmVar);
      TILING\_DATA\_FIELD\_DEF\_ARR(uint16\_t, 3, mmArr);
    END\_TILING\_DATA\_DEF;
    // 注册中间结构体，第一个参数固定为struct\_name#Op，第二个参数即struct\_name, 如struct\_name为Matmul，第一参数为MatmulOp，第二个参数为Matmul
    REGISTER\_TILING\_DATA\_CLASS(MatmulOp, Matmul) // 注册中间结构体
    
*   定制tiling\_key注册不同Tiling结构体
    
    // REGISTER\_TILING\_DATA\_CLASS中第一个参数为${op\_type} + ‘\_’ + tiling\_key。若tiling\_key未注册匹配的tiling结构体，则会使用默认的结构体。如下面两种方式，tiling\_key不指定或者非1情况，tiling结构体为AddStruct；tiling\_key等于1的时候，tiling结构体为AddStructSample1
    
    // 以op\_type为Add为例，默认tiling结构体注册如下
    BEGIN\_TILING\_DATA\_DEF(AddStruct)
      TILING\_DATA\_FIELD\_DEF(uint16\_t, mmVar);
      TILING\_DATA\_FIELD\_DEF\_ARR(uint16\_t, 3, mmArr);
    END\_TILING\_DATA\_DEF;
    REGISTER\_TILING\_DATA\_CLASS(Add, AddStruct)
    
    // TilingKey等于1时注册结构体如下
    BEGIN\_TILING\_DATA\_DEF(AddStructSample1)
      TILING\_DATA\_FIELD\_DEF(uint16\_t, mmVar);
      TILING\_DATA\_FIELD\_DEF\_ARR(uint16\_t, 3, mmArr);
    END\_TILING\_DATA\_DEF;
    REGISTER\_TILING\_DATA\_CLASS(Add\_1, AddStructSample1)