Ascend C:BitMode 2D矩阵搬运 # LoadDataBitMode 2D矩阵搬运【免费下载链接】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不支持功能说明负责完成普通矩阵计算所需的2D格式数据的搬运以大小为512字节的数据分形为单位进行搬运支持的数据通路为L1 Buffer-L0A Buffer、L1 Buffer-L0B Buffer。本接口与LoadData2D矩阵搬运V2接口的差异在于参数的传入方式不同本接口传入的是一个联合体结构Load2DBitModeParam。函数原型template TPosition Dst, TPosition Src, typename T __aicore__ inline void LoadData(const LocalTensorT dst, const LocalTensorT src,const Load2DBitModeParam loadDataParams)参数说明表 1模板参数说明参数名称含义T源操作数和目的操作数的数据类型。Src源操作数存储的逻辑位置TPosition支持的取值为A1和B1仅本接口使用。Dst目的操作数存储的逻辑位置TPosition支持的取值为A2和B2仅本接口使用。表 2通用参数说明参数名称输入/输出含义dst输出目的操作数类型为LocalTensor。数据连续排列顺序由目的操作数所在TPosition决定具体约束如下• A2ZZ格式/NZ格式对应的分形大小为16 * (32字节 / sizeof(T))。• B2ZN格式对应的分形大小为 (32字节 / sizeof(T)) * 16。• A1/B1无格式要求一般情况下为NZ格式。NZ格式下对应的分形大小为16 * (32字节 / sizeof(T))。src输入源操作数类型为LocalTensor。数据类型需要与dst保持一致。loadDataParams输入LoadData参数结构体类型为Load2DBitModeParam具体参考表3。上述结构体参数定义请参考${INSTALL_DIR}/include/ascendc/basic_api/interface/kernel_struct_mm.h${INSTALL_DIR}请替换为CANN软件安装后文件存储路径。表 3Load2DBitModeParam类参数说明参数名称含义config0uint64_t类型与Load2DBitModeConfig0位域bit-field结构体类型参数config0BitMode组成联合体union初始化为0可以使用类对象的GetConfig0()函数获取其值。config0BitModeLoad2DBitModeConfig0位域bit-field结构体类型参数参考表4与config0组成联合体union。config1uint64_t类型与Load2DBitModeConfig1位域bit-field结构体类型参数config1BitMode组成联合体union初始化为0可以使用类对象的GetConfig1()函数获取其值。config1BitModeLoad2DBitModeConfig1位域bit-field结构体类型参数参考表5与config1组成联合体union。ifTranspose是否启用转置功能对每个分形矩阵进行转置默认为false。含义与LoadData2DParamsV2结构体中的同名参数含义相同具体参考LoadData2D矩阵搬运。• true启用• false不启用开启转置功能时支持的数据类型约束如下源操作数、目的操作数支持b4、b8、b16、b32数据类型。Load2DBitModeParam类参数设计思想说明联合体union是一种特殊的数据结构允许在相同的内存位置存储不同的数据类型。union的所有成员共享同一块内存空间大小由最大成员决定同一时间只能使用一个成员。位域bit-field是一种特殊的类成员允许精确控制结构体中成员变量所占用的内存位数。结构体中成员变量从上到下对应内存中从低位到高位。Load2DBitModeParam类使用union与bit-field方法采用bit位表达参数类型使用bit-field结构体自动处理入参的bit位数并利用union的特性实现多参数融合传递仅需传递一个入参即可包含全部所需信息对应底层接口仅需要接收一个参数。同时当需要修改参数中某一bit位的值时仅需要通过循环和位运算即可实现不需要重新传入参数。与使用LoadData2DParamsV2结构体的LoadData接口相比减少了scalar计算实现性能提升。Load2DBitModeParam类可以直接使用LoadData2DParamsV2结构体类型对象初始化LoadData2DParamsV2 loadDataParams; loadDataParams.mStartPosition 0; loadDataParams.kStartPosition 0; loadDataParams.mStep 2; loadDataParams.kStep 2; loadDataParams.srcStride 2; loadDataParams.dstStride 2; loadDataParams.sid 0; loadDataParams.ifTranspose false; Load2DBitModeParam params(loadDataParams); // 直接使用LoadData2DParamsV2结构体类型对象初始化也可以使用各参数的Set函数修改参数值并且由于使用了联合体还可以对config0和config1直接进行逐bit位修改来修改参数。表 4Load2DBitModeConfig0结构体参数说明参数名称含义mStartPosition以M*K矩阵为例源矩阵M轴方向的起始位置单位为16个元素。该参数是位域结构体的最低位参数占用16bit可以使用Load2DBitModeParam类对象的SetMStartPosition()函数设置其值使用GetMStartPosition()函数获取其值具体参考表6。kStartPosition以M*K矩阵为例源矩阵K轴方向的起始位置单位为32字节。该参数是位域结构体的第二低位参数占用16bit可以使用Load2DBitModeParam类对象的SetKStartPosition()函数设置其值使用GetKStartPosition()函数获取其值具体参考表6。mStep以M*K矩阵为例源矩阵M轴方向搬运长度单位为16个元素。取值范围mStep∈[0, 255]。通过ifTranspose参数启用转置功能时mStep除需满足 [0, 255]的取值范围外还需满足以下额外约束• 当数据类型为b4时mStep必须是4的倍数• 当数据类型为b8时mStep必须是2的倍数• 当数据类型为b16时mStep必须是1的倍数• 当数据类型为b32时mStep无额外约束。该参数是位域结构体的第三低位参数占用8bit可以使用Load2DBitModeParam类对象的SetMStep()函数设置其值使用GetMStep()函数获取其值具体参考表6。kStep以M*K矩阵为例源矩阵K轴方向搬运长度单位为32字节。取值范围kStep∈[0, 255]。通过ifTranspose参数启用转置功能时kStep除需满足[0, 255]的取值范围外还需满足以下额外约束• 当数据类型为b4、b8或b16时kStep没有额外约束• 当数据类型为b32时kStep必须是2的倍数。该参数是位域结构体的最高位参数占用8bit可以使用Load2DBitModeParam类对象的SetKStep()函数设置其值使用GetKStep()函数获取其值具体参考表6。Load2DBitModeConfig0结构体参数的含义与LoadData2DParamsV2结构体中的同名参数含义相同具体参考LoadData2D矩阵搬运。表 5Load2DBitModeConfig1结构体参数说明参数名称含义srcStride以M*K矩阵为例源矩阵K方向前一个分形起始地址与后一个分形起始地址的间隔单位512字节。该参数是位域结构体的最低位参数占用16bit可以使用Load2DBitModeParam类对象的SetSrcStride()函数设置其值使用GetSrcStride()函数获取其值具体参考表6。dstStride以M*K矩阵为例目标矩阵K方向前一个分形起始地址与后一个分形起始地址的间隔单位512字节。该参数是位域结构体的最高位参数占用16bit可以使用Load2DBitModeParam类对象的SetDstStride()函数设置其值使用GetDstStride()函数获取其值具体参考表6。Load2DBitModeConfig1结构体参数的含义与LoadData2DParamsV2结构体中的同名参数含义相同具体参考LoadData2D矩阵搬运。表 6Load2DBitModeParam类成员函数说明函数名称功能void SetMStartPosition(uint32_t mStartPosition_)将Load2DBitModeConfig0结构体参数mStartPosition的值设置为mStartPosition_。void SetKStartPosition(uint32_t kStartPosition_)将Load2DBitModeConfig0结构体参数kStartPosition的值设置为kStartPosition_。void SetMStep(uint16_t mStep_)将Load2DBitModeConfig0结构体参数mStep的值设置为mStep_。void SetKStep(uint16_t kStep_)将Load2DBitModeConfig0结构体参数kStep的值设置为kStep_。void SetSrcStride(int32_t srcStride_)将Load2DBitModeConfig1结构体参数srcStride的值设置为srcStride_。void SetDstStride(uint16_t dstStride_)将Load2DBitModeConfig1结构体参数dstStride的值设置为dstStride_。uint32_t GetMStartPosition() const获取Load2DBitModeConfig0结构体参数mStartPosition的值。uint32_t GetKStartPosition() const获取Load2DBitModeConfig0结构体参数kStartPosition的值。uint16_t GetMStep() const获取Load2DBitModeConfig0结构体参数mStep的值。uint16_t GetKStep() const获取Load2DBitModeConfig0结构体参数kStep的值。int32_t GetSrcStride() const获取Load2DBitModeConfig1结构体参数srcStride的值。uint16_t GetDstStride() const获取Load2DBitModeConfig1结构体参数dstStride的值。数据类型支持数据类型为int8_t、uint8_t、fp4x2_e2m1_t、fp4x2_e1m2_t、hifloat8_t、fp8_e5m2_t、fp8_e4m3fn_t、half、bfloat16_t、int32_t、uint32_t、float。返回值说明无约束说明操作数地址对齐要求请参见通用地址对齐约束。针对Ascend 950PR/Ascend 950DT仅支持L1 Buffer-L0A Buffer、L1 Buffer-L0B Buffer数据通路。调用示例完整搬运流程请参考LoadData2D矩阵搬运V2样例。LoadDataBitMode 2D矩阵搬运的使用可以参考下面的调用示例L1上为NZ数据排布、shape为[M,K]的A矩阵调用LoadData指令完成L1 Buffer-L0A Buffer的Nz2Nz搬运。示例一使用LoadData2DParamsV2构造Load2DBitModeParamconstexpr uint32_t fractalElemCount 256; constexpr uint32_t tensorElemCount 4 * fractalElemCount; // 源操作数L1 Buffer存放32x32的half矩阵。 AscendC::LocalTensorhalf srcLocal(AscendC::TPosition::A1, a1Addr, tensorElemCount); // 目的操作数L0A Buffer预留4个512B分形接收完整32x32 half矩阵。 AscendC::LocalTensorhalf dstLocal(AscendC::TPosition::A2, a2Addr, tensorElemCount); AscendC::LoadData2DParamsV2 loadDataParams; // 从源矩阵M轴第0个16元素开始搬运。 loadDataParams.mStartPosition 0; // 从源矩阵K轴第0个32B开始搬运。 loadDataParams.kStartPosition 0; // M方向搬运2 * 16个元素。 loadDataParams.mStep 2; // K方向搬运32个half即2 * 32B。 loadDataParams.kStep 2; // 源L1的M方向有2个分形K方向相邻源分形起始地址间隔为2 * 512B。 loadDataParams.srcStride 2; // 目的L0A按2个M方向分形连续排布K方向相邻目的分形起始地址间隔为2 * 512B。 loadDataParams.dstStride 2; // 不对每个分形做转置保持L1中的分形方向搬入L0A。 loadDataParams.ifTranspose false; // 预留参数固定配置为0。 loadDataParams.sid 0; // 使用LoadData2DParamsV2构造bit mode参数底层以bit位形式传递上述搬运配置。 AscendC::Load2DBitModeParam bitModeParams(loadDataParams); AscendC::LoadDataAscendC::TPosition::A2, AscendC::TPosition::A1, half(dstLocal, srcLocal, bitModeParams);示例二使用Set函数修改Load2DBitModeParamAscendC::Load2DBitModeParam bitModeParams; // 从源矩阵M轴第0个16元素开始搬运。 bitModeParams.SetMStartPosition(0); // 从源矩阵K轴第0个32B开始搬运。 bitModeParams.SetKStartPosition(0); // M方向搬运2 * 16个元素。 bitModeParams.SetMStep(2); // K方向搬运32个half即2 * 32B。 bitModeParams.SetKStep(2); // 源L1的M方向有2个分形K方向相邻源分形起始地址间隔为2 * 512B。 bitModeParams.SetSrcStride(2); // 目的L0A按2个M方向分形连续排布K方向相邻目的分形起始地址间隔为2 * 512B。 bitModeParams.SetDstStride(2); // 不对每个分形做转置保持L1中的分形方向搬入L0A。 bitModeParams.SetIfTranspose(false); AscendC::LoadDataAscendC::TPosition::A2, AscendC::TPosition::A1, half(dstLocal, srcLocal, bitModeParams);【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考