SetFmatrix
产品支持情况
- 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:支持
功能说明
头文件路径为:"basic_api/kernel_operator_mm_intf.h"。
用于调用LoadData(卷积数据搬运)时设置FeatureMap的属性描述。LoadData(卷积数据搬运)的模板参数isSetFMatrix设置为false时,表示LoadData(卷积数据搬运)传入的FeatureMap的属性(包括l1H、l1W、padList,参数介绍参考表3 LoadData3DParamsV1结构体内参数说明、表4 LoadData3DParamsV2结构体内参数说明)将不生效,开发者需要通过该接口进行设置。
函数原型
C++
__aicore__ inline void SetFmatrix(uint16_t l1H, uint16_t l1W, const uint8_t padList[4], const FmatrixMode& fmatrixMode)
参数说明
表1 参数说明
| 参数名称 | 输入/输出 | 含义 |
|---|---|---|
| l1H | 输入 | 源操作数height,取值范围:l1H∈[1, 32767]。 |
| l1W | 输入 | 源操作数width,取值范围:l1W∈[1, 32767]。 |
| padList | 输入 | padding列表 [padding_left, padding_right, padding_top, padding_bottom],每个元素取值范围:[0,255]。默认为{0, 0, 0, 0}。 |
| fmatrixMode | 输入 | 用于控制LoadData指令从left还是right寄存器获取信息。FmatrixMode类型,定义如下。当前只支持FMATRIX_LEFT,左右矩阵均使用该配置。enum class FmatrixMode : uint8_t { |
返回值说明
无
约束说明
- 该接口需要配合LoadData(卷积数据搬运)接口一起使用,需要在LoadData(卷积数据搬运)接口之前调用,其中fmatrixMode参数需要和LoadData(卷积数据搬运)接口参数中的fMatrixCtrl值保持一致。
- 操作数地址对齐要求请参见通用地址对齐约束。
调用示例
完整调用示例参考SetLoadDataBoundary样例,以下为样例中的关键代码片段示例:
C++
AscendC::LoadData3DParamsV2<U> loadData3dParams;
loadData3dParams.l1W = 1;
loadData3dParams.l1H = K;
loadData3dParams.channelSize = N;
loadData3dParams.kExtension = N;
loadData3dParams.mExtension = K;
loadData3dParams.kStartPt = 0;
loadData3dParams.mStartPt = 0;
loadData3dParams.strideW = 1;
loadData3dParams.strideH = 1;
loadData3dParams.filterW = 1;
loadData3dParams.filterH = 1;
loadData3dParams.dilationFilterW = 1;
loadData3dParams.dilationFilterH = 1;
loadData3dParams.enTranspose = true;
loadData3dParams.enSmallK = false;
loadData3dParams.padValue = 0;
loadData3dParams.filterSizeW = 0;
loadData3dParams.filterSizeH = 0;
loadData3dParams.fMatrixCtrl = false;
uint8_t padList[AscendC::PAD_SIZE] = {0, 0, 0, 0};
static constexpr AscendC::IsResetLoad3dConfig LOAD3D_CONFIG = {false, false};
AscendC::SetFmatrix(N, 1, padList, AscendC::FmatrixMode::FMATRIX_LEFT); // 使能FM内存排布模式,从left寄存器获取信息
#if defined(__NPU_ARCH__) && (__NPU_ARCH__ == 2201)
AscendC::SetLoadDataRepeat({0, 1, 0});
AscendC::SetLoadDataBoundary(0);
AscendC::SetLoadDataPaddingValue(0);
AscendC::LoadData<U, LOAD3D_CONFIG>(b2, rightMatrix, loadData3dParams);
#elif defined(__NPU_ARCH__) && (__NPU_ARCH__ == 3510)
uint16_t dstStride = DivCeil(N, 16);
AscendC::SetLoadDataRepeatWithStride({0, 1, 0, dstStride});
AscendC::SetLoadDataPaddingValue(0);
AscendC::LoadDataWithStride<U, LOAD3D_CONFIG>(b2, rightMatrix, loadData3dParams);
#endif