Global Memory到L1 Buffer数据搬运【免费下载链接】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 训练系列产品不支持功能说明头文件路径为tensor_api/tensor.h。Tensor API通过Copy接口统一执行不同通路数据搬运。该接口用于将Global Memory中的数据搬运到L1 Buffer。Copy接口根据源张量和目的张量的存储位置、数据类型和Layout选择具体搬运实现。搬运块数、搬运长度、源/目的侧步长以及格式转换相关信息由Tensor Layout推导用户不需要在Copy调用中额外传入搬运参数。该通路用于矩阵计算输入搬入支持以下场景连续数据搬入源数据从Global Memory搬入L1 Buffer后数据格式不变。高维切分数据搬入源/目的侧存在步长时根据Layout推导多段搬运。随路格式转换搬入从Global Memory搬入L1 Buffer的同时完成ND/DN等到NZ/ZN等的矩阵格式转换。Batch多矩阵搬入源/目的Layout带Batch轴时一次Copy完成多个矩阵的搬运支持ND2ND、ND2NZ、DN2NZ、ND2ZN、DN2ZN、ScaleAND2ZZ、ScaleADN2ZZ、ZZ2ZZ、ScaleBND2NN、ScaleBDN2NN、NN2NN随路格式转换。Scale数据搬入用于MX矩阵计算中ScaleA/ScaleB数据从Global Memory搬入L1 Buffer。函数原型执行Global Memory到L1 Buffer搬运。template typename AtomType, typename DstTensor, typename SrcTensor __aicore__ inline void Copy(const CopyAtomAtomType atomCopy, const DstTensor dst, const SrcTensor src)使用默认trait构造搬运原子对象。template typename CopyOperationType __aicore__ inline constexpr auto MakeCopy(const CopyOperationType copyOperation)使用指定trait构造搬运原子对象。template typename CopyOperationType, typename CopyTraitType __aicore__ inline constexpr auto MakeCopy(const CopyOperationType copyOperation, const CopyTraitType copyTrait)Global Memory到L1 Buffer通路使用CopyGM2L1{}作为copyOperation使用CopyGM2L1TraitDefault{}作为默认trait对象。参数说明模板参数说明参数名描述AtomTypeCopyAtom的模板参数由MakeCopy(CopyGM2L1{})或MakeCopy(CopyGM2L1{}, CopyGM2L1TraitDefault{})推导得到。DstTensor目的张量类型。Global Memory到L1 Buffer搬运时需为Tensor API Tensor类型存储位置为Location::L1。SrcTensor源张量类型。Global Memory到L1 Buffer搬运时需为Tensor API Tensor类型存储位置为Location::GM。CopyOperationType搬运操作对象类型。Global Memory到L1 Buffer搬运取CopyGM2L1。CopyTraitType搬运trait对象类型。Global Memory到L1 Buffer默认取CopyGM2L1TraitDefault。函数参数说明表1Copy接口参数说明参数名输入/输出描述atomCopy输入搬运原子对象。Global Memory到L1 Buffer搬运可通过MakeCopy(CopyGM2L1{})或MakeCopy(CopyGM2L1{}, CopyGM2L1TraitDefault{})构造。dst输出目的张量存储位置为Location::L1。src输入源张量存储位置为Location::GM。表2MakeCopy接口参数说明参数名输入/输出描述copyOperation输入搬运操作对象。Global Memory到L1 Buffer搬运取CopyGM2L1{}。copyTrait输入搬运trait对象。Global Memory到L1 Buffer默认取CopyGM2L1TraitDefault{}。数据类型源张量和目的张量的数据类型需要保持一致。| 源操作数数据格式 | 目的操作数数据格式 | 源操作数/目的操作数数据类型 | | -- | -- | -- | | ND | ND | fp4x2_e2m1_t/fp4x2_e1m2_t/int8_t/uint8_t/hifloat8_t/fp8_e5m2_t/fp8_e4m3fn_t/int16_t/uint16_t/half/bfloat16_t/int32_t/uint32_t/float/int64_t/uint64_t | | ND | NZ | fp4x2_e2m1_t/fp4x2_e1m2_t/int8_t/uint8_t/hifloat8_t/fp8_e5m2_t/fp8_e4m3fn_t/int16_t/uint16_t/half/bfloat16_t/int32_t/uint32_t/float | | ND | ZN | int8_t/uint8_t/hifloat8_t/fp8_e5m2_t/fp8_e4m3fn_t/int16_t/uint16_t/half/bfloat16_t/int32_t/uint32_t/float | | DN | NZ | int8_t/uint8_t/hifloat8_t/fp8_e5m2_t/fp8_e4m3fn_t/int16_t/uint16_t/half/bfloat16_t/int32_t/uint32_t/float | | DN | ZN | fp4x2_e2m1_t/fp4x2_e1m2_t/int8_t/uint8_t/hifloat8_t/fp8_e5m2_t/fp8_e4m3fn_t/int16_t/uint16_t/half/bfloat16_t/int32_t/uint32_t/float | | NZ | NZ | fp4x2_e2m1_t/fp4x2_e1m2_t/int8_t/uint8_t/hifloat8_t/fp8_e5m2_t/fp8_e4m3fn_t/int16_t/uint16_t/half/bfloat16_t/int32_t/uint32_t/float/int64_t/uint64_t | | ZN | ZN | fp4x2_e2m1_t/fp4x2_e1m2_t/int8_t/uint8_t/hifloat8_t/fp8_e5m2_t/fp8_e4m3fn_t/int16_t/uint16_t/half/bfloat16_t/int32_t/uint32_t/float/int64_t/uint64_t | | ScaleAND | ZZ | fp8_e8m0_t | | ScaleADN | ZZ | fp8_e8m0_t | | ZZ | ZZ | fp8_e8m0_t | | ScaleBND | NN | fp8_e8m0_t | | ScaleBDN | NN | fp8_e8m0_t | | NN | NN | fp8_e8m0_t |返回值说明Copy无返回值。MakeCopy返回CopyAtom对象。约束说明位于Global Memory的源地址必须1B对齐位于L1 Buffer的目的地址必须32B对齐。数据连续搬运场景中搬运字节数需要32B对齐。若未对齐搬运量会向下取整到32B对齐。高维切分搬运场景中搬运长度、源步长和目的步长均按32B对齐。当输入数据是b4类型时按b8类型搬运粒度处理Layout推导参数需要满足对应粒度约束。Batch多矩阵搬入仅支持ND2ND、ND2NZ、DN2NZ、ND2ZN、DN2ZN、ScaleAND2ZZ、ScaleADN2ZZ、ZZ2ZZ、ScaleBND2NN、ScaleBDN2NN、NN2NN格式转换Batch数受搬运指令字段范围限制需不大于4095。关键特性说明随路格式转换搬入随路格式转换搬入表示从Global Memory搬入L1 Buffer时同步完成矩阵格式转换。接口根据源Layout和目的Layout自动选择转换方向支持以下格式转换ND2ND、ND2NZ、ND2ZN、DN2NZ、DN2ZN、NZ2NZ、ZN2ZN。 ND到NZ的格式转换等价于DN到ZN的格式转换DN到NZ的格式转换等价于ND到ZN的格式转换。ND2NZ连续搬运ND2NZ连续搬运表示源矩阵按ND格式连续排布目的矩阵按NZ格式连续排布。该场景由Layout自动推导单段搬运参数搬运过程中完成ND到NZ的格式转换目的端按32B对齐补0。ND2NZ非连续搬运ND2NZ非连续搬运表示源侧或目的侧存在步长、切分维度等高维切分信息。该场景归属于高维切分数据搬入Copy会根据Layout自动推导多段搬运参数搬运过程中完成ND到NZ的格式转换目的端按32B对齐补0。DN2NZ连续搬运DN2NZ连续搬运表示源矩阵按DN格式连续排布目的矩阵按NZ格式连续排布。该场景由Layout自动推导单段搬运参数搬运过程中完成DN到NZ的排布转换目的端按32B对齐补0。DN2NZ非连续搬运DN2NZ非连续搬运表示源侧或目的侧存在步长、切分维度等高维切分信息。该场景归属于高维切分数据搬入Copy会根据Layout自动推导多段搬运参数搬运过程中完成DN到NZ的格式转换目的端按32B对齐补0。Scale数据搬入Scale数据搬入用于矩阵计算中scale相关数据从Global Memory搬入L1 Buffer。A矩阵相关scale支持ScaleAND到ZZ、ScaleADN到ZZ、ZZ到ZZ的格式转换。B矩阵相关scale支持ScaleBND到NN、ScaleBDN到NN、NN到NN的格式转换。Batch多矩阵搬入Batch多矩阵搬入表示一次Copy完成多个矩阵的搬运。当源张量和目的张量的Layout带有Batch轴时Copy一条指令完成多个矩阵的搬运接口调用方式与单矩阵搬运完全一致无需额外传入Batch相关参数。带Batch轴的Layout在原矩阵Layout外层增加一维BatchBatch内存连续场景可通过MakeFrameLayout构造Batch内存非连续场景可通过MakeLayout显式指定Shape和Stride构造。例如Batch内存连续场景通过MakeFrameLayoutLayoutPattern(B, M, K)构造其中B为Batch数M、K为单个矩阵的行、列。Layout语义为Shape为(B, (M, K))。Stride为(M * K, (K, 1))即各矩阵在内存上按M * K连续排布单矩阵内存按照ND格式连续排布。Batch内存非连续场景可通过MakeLayout(shape, stride)构造其中shape描述Batch数和单个矩阵的Shapestride描述Batch轴和矩阵内部各轴的地址间隔。以按K方向跨Batch连续排布的ND矩阵为例Layout语义为Shape为(B, (M, K))。Stride为(K, (B * K, 1))即各矩阵在内存上为非连续内存跨Batch在K方向上连续排布。搬运行为源Global Memory侧各Batch矩阵的源地址间距由Layout的Batch轴Stride决定借助Batch轴Stride参数Batch数据支持Batch间连续和非连续两种排布形式。目的L1 Buffer侧各Batch矩阵在L1 Buffer中连续存放Batch间的地址间隔等于对齐后单个矩阵的占用空间。调用示例以下示例将Global Memory中的ND矩阵搬入L1 Buffer并转换为NZ格式。#include tensor_api/tensor.h using namespace AscendC::Te; constexpr uint32_t M 32; constexpr uint32_t K 64; __aicore__ inline void CopyGmToL1(__gm__ half* gmAddr) { __cbuf__ half l1Buf[M * K]; // 源张量Global Memory上的ND格式矩阵目的张量L1 Buffer上的NZ格式矩阵 auto gmA MakeTensor(MakeMemPtr(gmAddr), MakeFrameLayoutNDExtLayoutPtn(M, K)); auto l1A MakeTensor(MakeMemPtr(l1Buf), MakeFrameLayoutNZLayoutPtn, half(M, K)); // 构造GM到L1搬运原子对象Copy根据源/目的Layout自动完成ND到NZ的随路格式转换 auto copyGm2L1 MakeCopy(CopyGM2L1{}, CopyGM2L1TraitDefault{}); Copy(copyGm2L1, l1A, gmA); }以下示例将Global Memory中的B个ND矩阵一次性搬入L1 Buffer并转换为NZ格式。源张量和目的张量均使用带Batch轴的Layout接口调用方式与单矩阵搬运一致。#include tensor_api/tensor.h using namespace AscendC::Te; constexpr uint32_t B 4; constexpr uint32_t M 32; constexpr uint32_t K 64; __aicore__ inline void CopyBatchGmToL1(__gm__ half* gmAddr) { __cbuf__ half l1Buf[B * M * K]; // 构造带Batch轴的源/目的LayoutB个矩阵MakeFrameLayout在原Layout外层增加一维Batch auto gmA MakeTensor(MakeMemPtr(gmAddr), MakeFrameLayoutNDExtLayoutPtn(B, M, K)); auto l1A MakeTensor(MakeMemPtr(l1Buf), MakeFrameLayoutNZLayoutPtn, half(B, M, K)); // 调用方式与单矩阵一致Copy一条指令完成B个矩阵的ND到NZ搬运 auto copyGm2L1 MakeCopy(CopyGM2L1{}, CopyGM2L1TraitDefault{}); Copy(copyGm2L1, l1A, gmA); }【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考