GetMMConfig
功能说明
灵活的自定义Matmul模板参数配置。通过设置MatmulConfigMode、MatmulShapeParams、MatmulQuantParams、MatmulBatchParams、MatmulFuncParams,获取自定义的MatmulConfig。
MatmulConfigMode指定了获取并要修改的MatmulConfig模板,各模板介绍请参考模板特性;用户根据使用需求通过设置可变参数,即一个或多个任意顺序的MatmulShapeParams、MatmulQuantParams、MatmulBatchParams、MatmulFuncParams,修改该MatmulConfig模板的相应参数配置。相比GetNormalConfig、GetMDLConfig等获取模板的接口,该接口提供了更灵活的自定义Matmul模板参数的配置方式。
函数原型
          1 2  | 
         
          template <MatmulConfigMode configMode, typename... ArgTypes> __aicore__ inline constexpr MatmulConfig GetMMConfig(ArgTypes&&... args)  | 
        
参数说明
| 
          参数名  | 
        
          描述  | 
       
|---|---|
| 
          configMode  | 
        
          获取的MatmulConfig模板。  | 
       
| 
          ArgTypes  | 
        
          可变模板参数。  | 
       
| 
          参数名  | 
        
          输入/输出  | 
        
          描述  | 
       
|---|---|---|
| 
          args  | 
        
          输入  | 
        
          可变参数,任意顺序传入需要设置的MatmulShapeParams、MatmulQuantParams、MatmulBatchParams、MatmulFuncParams中的一个或多个。  | 
       
| 
         参数  | 
       
         说明  | 
      
|---|---|
| 
         CONFIG_NORM  | 
       
         表示设置MatmulConfig默认值为Norm模板  | 
      
| 
         CONFIG_MDL  | 
       
         表示设置MatmulConfig默认值为MDL模板  | 
      
| 
         CONFIG_SPECIALMDL  | 
       
         表示设置MatmulConfig默认值为SpecialMDL模板  | 
      
| 
         CONFIG_IBSHARE  | 
       
         表示设置MatmulConfig默认值为IBShare模板  | 
      
| 
         参数  | 
       
         数据类型  | 
       
         说明  | 
      
|---|---|---|
| 
         singleCoreM  | 
       
         uint32_t  | 
       
         单核内M轴shape大小,以元素为单位。  | 
      
| 
         singleCoreN  | 
       
         uint32_t  | 
       
         单核内N轴shape大小,以元素为单位。  | 
      
| 
         singleCoreK  | 
       
         uint32_t  | 
       
         单核内K轴shape大小,以元素为单位。  | 
      
| 
         basicM  | 
       
         uint32_t  | 
       
         与TCubeTiling结构体中的baseM参数含义相同,Matmul计算时base块M轴长度,以元素为单位。  | 
      
| 
         basicN  | 
       
         uint32_t  | 
       
         与TCubeTiling结构体中的baseN参数含义相同,Matmul计算时base块N轴长度,以元素为单位。  | 
      
| 
         basicK  | 
       
         uint32_t  | 
       
         与TCubeTiling结构体中的baseK参数含义相同,Matmul计算时base块K轴长度,以元素为单位。  | 
      
| 
         参数  | 
       
         数据类型  | 
       
         说明  | 
      
|---|---|---|
| 
         isPerTensor  | 
       
         bool  | 
       
         A矩阵half类型输入且B矩阵int8_t类型输入场景,使能B矩阵量化时是否为per tensor。 
  | 
      
| 
         hasAntiQuantOffset  | 
       
         bool  | 
       
         A矩阵half类型输入且B矩阵int8_t类型输入场景,使能B矩阵量化时是否使用offset系数。  | 
      
| 
         参数  | 
       
         数据类型  | 
       
         说明  | 
      
|---|---|---|
| 
         batchLoop  | 
       
         bool  | 
       
         是否多Batch输入多Batch输出。仅对BatchMatmul有效。参数取值如下: 
  | 
      
| 
         bmmMode  | 
       
         BatchMode  | 
       
         BatchMatmul场景中Layout类型为NORMAL时,设置BatchMatmul输入A/B矩阵的多batch数据总和与L1 Buffer的大小关系。参数取值如下: 
  | 
      
| 
         isBiasBatch  | 
       
         bool  | 
       
         批量多Batch的Matmul场景,即BatchMatmul场景,Bias的大小是否带有Batch轴。参数取值如下: 
 
  | 
      
| 
         参数  | 
       
         数据类型  | 
       
         说明  | 
      ||
|---|---|---|---|---|
| 
         intrinsicsLimit  | 
       
         bool  | 
       
         当左矩阵或右矩阵在单核上内轴(即尾轴)大于等于65535(元素个数)时,是否使能循环执行数据从Global Memory到L1 Buffer的搬入。例如,左矩阵A[M, K],单核上的内轴数据singleCoreK大于65535,配置该参数为true后,API内部通过循环执行数据的搬入。参数取值如下: 
  | 
      ||
| 
         enVecND2NZ  | 
       
         bool  | 
       
         使能通过vector指令进行ND2NZ。使能时需要设置SetLocalWorkspace。参数取值如下: 
 针对  | 
      ||
| 
         doMTE2Preload  | 
       
         uint32_t  | 
       
         在MTE2流水间隙较大,且M/N数值较大时可通过该参数开启对应M/N方向的预加载功能,开启后能减小MTE2间隙,提升性能。预加载功能仅在MDL模板有效(不支持SpecialMDL模板)。参数取值如下: 
 注意:开启M/N方向的预加载功能时需保证K全载且M/N方向开启double buffer;其中,M方向的K全载条件为:singleCoreK/baseK <= stepKa;N方向的K全载条件为:singleCoreK/baseK <= stepKb。  | 
      ||
| 
         enableReuse  | 
       
         bool  | 
       
         SetSelfDefineData函数设置的回调函数中的dataPtr是否直接传递计算数据。若未调用SetSelfDefineData设置dataPtr,该参数仅支持默认值true。参数取值如下: 
  | 
      ||
| 
         enableUBReuse  | 
       
         bool  | 
       
         是否使能Unified Buffer复用。在Unified Buffer空间足够的条件下(Unified Buffer空间大于4倍TCubeTiling的transLength参数),使能该参数后,Unified Buffer空间分为互不重叠的两份,分别存储Matmul计算相邻前后两轮迭代的数据,后一轮迭代数据的搬入将不必等待前一轮迭代的Unified Buffer空间释放,从而优化流水。参数取值如下: 
  | 
      ||
| 
         enableL1CacheUB  | 
       
         bool  | 
       
         是否使能L1 Buffer缓存Unified Buffer计算块。建议在MTE3和MTE2流水串行较多的场景使用。参数取值如下: 
 若要使能L1 Buffer缓存Unified Buffer计算块,必须在Tiling实现中调用SetMatmulConfigParams接口将参数enableL1CacheUBIn设置为true。  | 
      ||
| 
         iterateOrder  | 
       
         IterateOrder  | 
       
         Matmul做矩阵运算的循环迭代顺序,与表1中的iterateOrder参数含义相同。当ScheduleType参数取值为ScheduleType::OUTER_PRODUCT或1时,本参数生效。参数取值如下: 
 注:Norm模板的Matmul场景、MDL模板使用时,若IterateOrder取值ORDER_M,TCubeTiling结构中的stepN需要大于1,IterateOrder取值ORDER_N时,TCubeTiling结构中的stepM需要大于1。  | 
      ||
| 
         scheduleType  | 
       
         ScheduleType  | 
       
         配置Matmul数据搬运模式。参数取值如下: 
 注: 
  | 
      ||
| 
         enableDoubleCache  | 
       
         bool  | 
       
         开启IBShare模板后,在L1 Buffer上是否同时缓存两块数据。参数取值如下: 
 注意:该参数取值为true时,需要控制基本块大小,防止两块数据的缓存超过L1 Buffer大小限制。  | 
      ||
| 
         isA2B2Shared  | 
       
         bool  | 
       
         是否开启A2和B2的全局管理,即控制所有Matmul对象是否共用A2和B2的double buffer机制。该配置为全局配置,所有Matmul对象取值必须保持一致。注意,开启时,A矩阵、B矩阵的基本块大小均不能超过32KB。 参数取值如下: 
 该参数取值为true时,建议同时设置enUnitFlag参数为true,使搬运与计算流水并行,提高性能。该参数的使用样例请参考Matmul A2和B2全局管理样例。  | 
      ||
| 
         isEnableChannelSplit  | 
       
         bool  | 
       
         是否使能channel_split功能。正常情况下,Matmul计算出的CubeFormat::NZ格式的C矩阵分形为16*16,假设此时的分形个数为x,channel_split功能是使获得的C矩阵分形为16*8,同时分形个数变为2x。注意,当前仅在Matmul计算结果C矩阵的Format为CubeFormat::NZ,TYPE为float类型,输出到Global Memory的场景,支持使能该参数。参数取值如下: 
  | 
      
返回值
支持的型号
约束说明
无
调用示例
          1 2 3 4 5 6 7 8 9 10 11  | 
         
          // 获取MatmulConfig模板为Norm模板 constexpr static MatmulConfigMode configMode = MatmulConfigMode::CONFIG_NORM; // singleCoreM、singleCoreN、singleCoreK、basicM、basicN、basicK constexpr static MatmulShapeParams shapeParams = {128, 128, 128, 64, 64, 64}; // B矩阵量化时为per channel且不使用offset系数 constexpr static MatmulQuantParams quantParams = {false, false}; // 不使能多Batch constexpr static MatmulBatchParams batchParams{false}; // 不进行芯片指令搬运地址偏移量校验,使能通过vector进行ND2NZ constexpr static MatmulFuncParams funcParams{false, true}; constexpr static MatmulConfig mmConfig = GetMMConfig<configMode>(shapeParams, quantParams, batchParams, funcParams);  |