CANN/asc-devkit GMToL1-2D矩阵搬运V2
# GMToL1-2D矩阵搬运V2LoadData【免费下载链接】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不支持功能说明头文件路径为basic_api/kernel_operator_mm_intf.h。负责完成普通矩阵计算所需的2D格式数据的搬运以大小为512字节的数据分形为单位从Global Memory搬运至L1 BufferTPosition为A1/B1。函数原型template typename T __aicore__ inline void LoadData(const LocalTensorT dst, const GlobalTensorT src, const LoadData2DParamsV2 loadDataParams)参数说明表 1模板参数说明参数名称含义T源操作数和目的操作数的数据类型。表 2通用参数说明参数名称输入/输出含义dst输出目的操作数类型为LocalTensor。支持的物理存储位置为L1 BufferTPosition为A1/B1。数据分形无格式要求一般情况下为NZ格式。NZ格式下对应的分形大小为16 * (32字节 / sizeof(T))。src输入源操作数类型为GlobalTensor。数据类型需要与dst保持一致。loadDataParams输入LoadData参数结构体类型为LoadData2DParamsV2具体参考表3。表 3LoadData2DParamsV2结构体内参数说明参数名称含义mStartPosition以M*K矩阵为例源矩阵M轴方向的起始位置单位为16个元素。kStartPosition以M*K矩阵为例源矩阵K轴方向的起始位置单位为32字节。mStep以M*K矩阵为例源矩阵M轴方向搬运长度单位为16个元素。取值范围mStep∈[0, 255]。注mStep0表示不执行搬运该接口将被视为NOP空操作。kStep以M*K矩阵为例源矩阵K轴方向搬运长度单位为32字节。取值范围kStep∈[0, 255]。注kStep0表示不执行搬运该接口将被视为NOP空操作。srcStride以M*K矩阵为例源矩阵K方向前一个分形起始地址与后一个分形起始地址的间隔单位为512字节。dstStride以M*K矩阵为例目的矩阵K方向前一个分形起始地址与后一个分形起始地址的间隔单位为512字节。ifTranspose是否启用转置功能对每个分形矩阵进行转置默认为false。• true启用。• false不启用。注意本通路场景下GM-L1 Buffer不支持转置参数无意义保持默认值即可。sid预留参数配置为0即可。LoadData2DParamsV2结构体在不启用转置时示意图如下参数设置值和解释说明如下mStartPosition 2表示源矩阵M轴方向的起始位置为第32个元素2*16个元素。kStartPosition 2表示源矩阵K轴方向的起始位置为第32个元素2*32字节。mStep 2表示源矩阵M轴方向搬运长度为32个元素2*16个元素。kStep 3表示源矩阵K轴方向搬运长度为48个元素3*32字节。srcStride 5表示源矩阵K方向前一个分形起始地址与后一个分形起始地址的间隔为1280个元素5*512字节。dstStride 3表示目的矩阵K方向前一个分形起始地址与后一个分形起始地址的间隔为768个元素3*512字节。ifTranspose false表示不启用转置。sid 0预留参数配置为0即可。图 1LoadData2DParamsV2结构体参数示例以half数据类型不启用转置为例数据类型支持数据类型为uint8_t、int8_t、fp4x2_e2m1_t、fp4x2_e1m2_t、hifloat8_t、fp8_e5m2_t、fp8_e4m3fn_t、half、bfloat16_t、uint32_t、int32_t、float。返回值说明无约束说明操作数地址对齐要求请参见通用地址对齐约束。本通路场景下不支持转置。调用示例以图 1所示的场景为例源矩阵为GM上Nz排布的half数据从M轴第2个分形、K轴第2个32B块开始搬运2个M方向分形、3个K方向32B块到L1 Buffer。constexpr uint32_t fractalElemCount 256; constexpr uint32_t srcElemCount 25 * fractalElemCount; constexpr uint32_t dstElemCount 9 * fractalElemCount; // 源操作数GM上按Nz分形排布存放half数据。一个512B分形包含256个half。 // GM shape为80 * 80M方向和K方向各有5个小分形因此预留5 * 5 25个512B分形。 AscendC::GlobalTensorhalf srcGm; srcGm.SetGlobalBuffer((__gm__ half *)src, srcElemCount); // 目的操作数L1 Buffer目的矩阵为3 * 3个小分形因此预留9个512B分形。 AscendC::LocalTensorhalf dstLocal(AscendC::TPosition::A1, 0, dstElemCount); AscendC::LoadData2DParamsV2 loadDataParams; // 源矩阵M轴起始位置为第32个元素即2 * 16个元素。 loadDataParams.mStartPosition 2; // 源矩阵K轴起始位置为第32个half即2 * 32B。 loadDataParams.kStartPosition 2; // M方向搬运32个元素即2 * 16个元素。 loadDataParams.mStep 2; // K方向搬运48个half即3 * 32B。 loadDataParams.kStep 3; // GM源矩阵M方向有5个小分形。 loadDataParams.srcStride 5; // 目的A1矩阵M方向有3个小分形。 loadDataParams.dstStride 3; // 不启用转置。 loadDataParams.ifTranspose false; // 预留参数固定配置为0。 loadDataParams.sid 0; AscendC::LoadData(dstLocal, srcGm, loadDataParams);【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考