
# SetFmatrixBitMode【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit产品支持情况Ascend 950PR/Ascend 950DT支持Atlas A3 训练系列产品/Atlas A3 推理系列产品不支持Atlas A2 训练系列产品/Atlas A2 推理系列产品不支持Atlas 200I/500 A2 推理产品不支持Atlas 推理系列产品AI Core不支持Atlas 推理系列产品Vector Core不支持Atlas 训练系列产品不支持Kirin X90不支持Kirin 9030不支持功能说明用于调用LoadData卷积数据搬运时设置FeatureMap的属性描述。LoadData卷积数据搬运的模板参数isSetFMatrix设置为false时表示LoadData卷积数据搬运传入的FeatureMap的属性包括l1H、l1W、padList参数介绍参考表3 LoadData3DParamsV1结构体内参数说明、表4 LoadData3DParamsV2结构体内参数说明将不生效开发者需要通过该接口进行设置。函数原型__aicore__ inline void SetFmatrix(const SetFMatrixBitModeParams param, const FmatrixMode fmatrixMode)参数说明表1参数说明参数名称输入/输出含义fmatrixMode输入用于控制LoadData指令从left还是right寄存器获取信息。FmatrixMode类型定义如下。当前只支持FMATRIX_LEFT左右矩阵均使用该配置。enum class FmatrixMode : uint8_t {FMATRIX_LEFT 0,FMATRIX_RIGHT 1,};param输入类型为SetFMatrixBitMode具体参考表2。表2SetFMatrixBitMode类参数说明参数名称含义config0uint64_t类型与SetFMatrixBitModeConfig0位域bit-field结构体类型参数config0BitMode组成联合体union初始化为0可以使用类对象的GetConfig0()函数获取其值。config0BitModeSetFMatrixBitModeConfig0位域bit-field结构体类型参数参考表3与config0组成联合体union。SetFMatrixBitMode类参数设计思想说明联合体union是一种特殊的数据结构允许在相同的内存位置存储不同的数据类型。union的所有成员共享同一块内存空间大小由最大成员决定同一时间只能使用一个成员。位域bit-field是一种特殊的类成员允许精确控制结构体中成员变量所占用的内存位数。结构体中成员变量从上到下对应内存中从低位到高位。SetFMatrixBitMode类使用union与bit-field方法采用bit位表达参数类型使用bit-field结构体自动处理入参的bit位数并利用union的特性实现多参数融合传递仅需传递一个入参即可包含全部所需信息对应底层接口仅需要接收一个参数。同时当需要修改参数中某一bit位的值时仅通过循环和位运算即可实现不需要重新传入参数减少了scalar计算实现性能提升。SetFMatrixBitMode类可以直接使用LoadData3DParamsV2结构体类型对象初始化template typename T __aicore__ inline SetFMatrixBitModeParams(const LoadData3DParamsV2T loadData3DParams_);也可以使用各参数的Set函数修改参数值并且由于使用了联合体还可以对config0直接进行逐bit位修改来修改参数。表3SetFMatrixBitModeConfig0结构体参数说明参数名称含义l1H源操作数height取值范围l1H∈[1, 32767]。该参数是位域结构体的最低位参数占用16bit可以使用SetFMatrixBitMode类对象的SetL1H()函数设置其值。l1W源操作数width取值范围l1W∈[1, 32767]。该参数是位域结构体的第二低位参数占用16bit可以使用SetFMatrixBitMode类对象的SetL1W()函数设置其值。padList0对应表LoadData3DParamsV2结构体内参数说明中padding列表中的padding_left值取值范围[0,255]。默认为0。该参数是位域结构体的第三低位参数占用8bit可以使用SetFMatrixBitMode类对象的SetPadList()函数设置其值。padList1对应表1中padding列表中的padding_right值取值范围[0,255]。默认为0。该参数是位域结构体的第四低位参数占用8bit可以使用SetFMatrixBitMode类对象的SetPadList()函数设置其值。padList2对应表1中padding列表中的padding_top值取值范围[0,255]。默认为0。该参数是位域结构体的第五低位参数占用8bit可以使用SetFMatrixBitMode类对象的SetPadList()函数设置其值。padList3对应表1中padding列表中的padding_bottom值取值范围[0,255]。默认为0。该参数是位域结构体的最高位参数占用8bit可以使用SetFMatrixBitMode类对象的SetPadList()函数设置其值。返回值说明无约束说明该接口需要配合LoadData卷积数据搬运接口一起使用需要在LoadData卷积数据搬运接口之前调用。操作数地址对齐要求请参见通用地址对齐约束。调用示例AscendC::TPipe pipe; AscendC::TQueAscendC::TPosition::A1, 1 inQueueFmA1; AscendC::TQueAscendC::TPosition::A2, 1 inQueueFmA2; // weight queue AscendC::TQueAscendC::TPosition::B1, 1 inQueueWeB1; AscendC::TQueAscendC::TPosition::B2, 1 inQueueWeB2; pipe.InitBuffer(inQueueFmA1, 1, featureMapA1Size * sizeof(fmap_T)); pipe.InitBuffer(inQueueFmA2, 1, featureMapA2Size * sizeof(fmap_T)); pipe.InitBuffer(inQueueWeB1, 1, weightA1Size * sizeof(weight_T)); pipe.InitBuffer(inQueueWeB2, 1, weightB2Size * sizeof(weight_T)); pipe.InitBuffer(outQueueCO1, 1, dstCO1Size * sizeof(dstCO1_T)); AscendC::LocalTensorfmap_T featureMapA1 inQueueFmA1.DeQuefmap_T(); AscendC::LocalTensorweight_T weightB1 inQueueWeB1.DeQueweight_T(); AscendC::LocalTensorfmap_T featureMapA2 inQueueFmA2.AllocTensorfmap_T(); AscendC::LocalTensorweight_T weightB2 inQueueWeB2.AllocTensorweight_T(); uint16_t channelSize 32; uint16_t H 4, W 4; uint8_t Kh 2, Kw 2; uint16_t Cout 16; uint16_t C0, C1; uint8_t dilationH 2, dilationW 2; uint8_t padList[PAD_SIZE] {0, 0, 0, 0}; AscendC::SetFmatrix(H, W, padList, FmatrixMode::FMATRIX_LEFT); /* SetFMatrixBitModeParams param; param.SetL1H(H); param.SetL1W(W); param.SetPadList(padList); AscendC::SetFmatrix(param, FmatrixMode::FMATRIX_LEFT); */ AscendC::SetLoadDataPaddingValue(0); AscendC::SetLoadDataRepeat({0, 1, 0}); AscendC::SetLoadDataBoundary((uint32_t)0); static constexpr AscendC::IsResetLoad3dConfig LOAD3D_CONFIG {false,false}; AscendC::LoadDatafmap_T, LOAD3D_CONFIG(featureMapA2, featureMapA1, { padList, H, W, channelSize, k, howoRound, 0, 0, 1, 1, Kw, Kh, dilationW, dilationH, false, false, 0 }); AscendC::LoadData(weightB2, weightB1, { 0, weRepeat, 1, 0, 0, false, 0 }); inQueueFmA2.EnQuefmap_T(featureMapA2); inQueueWeB2.EnQueweight_T(weightB2); inQueueFmA1.FreeTensor(featureMapA1); inQueueWeB1.FreeTensor(weightB1);【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考