CopyL1ToL0A【免费下载链接】catlass本项目是CANN的算子模板库提供NPU上高性能矩阵乘及其相关融合类算子模板样例。项目地址: https://gitcode.com/cann/catlass代码位置[TOC]功能说明CopyL1ToL0A模板负责将 A 矩阵的 tile 块从 L1Local MemoryA1 Buffer搬运到 L0AA2 Buffer支持多种数据排布格式layout转换。根据源 layout 和目标 layout 的不同内部会选择合适的硬件搬运指令zN → zZNd 转置拷贝ifTranspose falsenZ → zZ转置拷贝Transpose AifTranspose true对于 int8_t 使用LoadDataWithTransposeNDC1HWC0 → zZ卷积专用路径使用LoadData3Dv2该模板通常不直接使用而是作为 TileCopy 的成员类型由blockMmad自动管理。仅在需要自定义 kernel 组装时显式声明。模板原型template class ArchTag, // 架构标签Arch::AtlasA2 或 Arch::Ascend950 class L1Type, // L1 数据描述Gemm::GemmTypeElement, Layout, AscendC::TPosition::A1 class L0Type void // L0A 数据描述Gemm::GemmTypeElement, Layout, AscendC::TPosition::A2可省略自动推导 struct CopyL1ToL0A { static_assert(DEPENDENT_FALSEArchTag, Unsupported copy l1 to l0, can not find the specialization.); };ArchTag架构标签Arch::AtlasA2或Arch::Ascend950L1TypeL1 上 A 矩阵的数据类型封装了 Element、Layout、TPositionL0TypeL0A 上 A 矩阵的数据类型默认为void大多数偏特化会自动推导偏特化实现AtlasA2源 Layout目标 Layout元素类型说明zNzZ任意基础 Nd 拷贝使用 LoadData2DzNzZfloatfloat 专用使用 LoadData3D 路径nZzZ任意非 int8_t转置拷贝使用 LoadData2DifTransposetruenZzZint8_t转置拷贝使用 LoadDataWithTransposenZzZfloat转置拷贝使用 LoadData3D含 SetFmatrix 对齐nNzZ任意nN 转 zZ 拷贝使用 LoadData2DnNzZfloatfloat 专用使用 LoadData2dTransposeNDC1HWC0zZ任意卷积专用使用 LoadData3Dv2Ascend950源 Layout目标 Layout元素类型说明zNzN任意基础 Nd 拷贝使用 LoadData2DParamsV2nZzN非 B8/B4int8_t/float8_e4m3_t/float8_e5m2_t/float4 等转置拷贝使用 LoadData2DParamsV2nZzNB8/B4int8_t/float8_e4m3_t/float8_e5m2_t/float4 等转置拷贝根据 L0M 对齐情况选择单次或分步 LoadData注意Ascend950 的L0Type目标 layout 均为 zN非 zZ与 AtlasA2 不同。调用接口基础接口所有偏特化通用void operator()( AscendC::LocalTensorElement dstTensor, // L0A 目标 tensor AscendC::LocalTensorElement srcTensor, // L1 源 tensor LayoutDst layoutDst, // L0A 数据 layout LayoutSrc layoutSrc // L1 数据 layout );卷积接口NDC1HWC0 偏特化void operator()( AscendC::LocalTensorElement dstTensor, AscendC::LocalTensorElement srcTensor, LayoutDst layoutDst, LayoutSrc layoutSrc, uint32_t kStartPt, uint32_t mStartPt, uint32_t l1H, uint32_t l1W, uint8_t* padList );该偏特化通过静态工厂方法构造实例static CopyL1ToL0A MakeCopyL1ToL0A( uint32_t strideW 0, uint32_t strideH 0, uint32_t filterW 0, uint32_t filterH 0, uint32_t dilationFilterW 0, uint32_t dilationFilterH 0 );调用示例基础 zN → zZ 搬运AtlasA2非 TLA#include catlass/gemm/tile/copy_l1_to_l0a.hpp using namespace Catlass::Gemm::Tile; using Element half; using L1Type Gemm::GemmTypeElement, layout::zN, AscendC::TPosition::A1; using L0Type Gemm::GemmTypeElement, layout::zZ, AscendC::TPosition::A2; uint32_t row 256; uint32_t col 256; // 构造 L1 上的 zN layout 和 L0A 上的 zZ layout auto layoutSrc layout::zN::MakeLayoutElement(row, col); auto layoutDst layout::zZ::MakeLayoutElement(row, col); AscendC::LocalTensorElement srcL1Tensor; AscendC::LocalTensorElement dstL0ATensor; // 实例化并调用 using CopyOp CopyL1ToL0AArch::AtlasA2, L1Type, L0Type; CopyOp copyOp; copyOp(dstL0ATensor, srcL1Tensor, layoutDst, layoutSrc);nZ → zZ 转置搬运AtlasA2非 TLAusing L1Type Gemm::GemmTypehalf, layout::nZ, AscendC::TPosition::A1; using L0Type Gemm::GemmTypehalf, layout::zZ, AscendC::TPosition::A2; auto layoutSrc layout::nZ::MakeLayouthalf(row, col); auto layoutDst layout::zZ::MakeLayouthalf(row, col); using CopyOp CopyL1ToL0AArch::AtlasA2, L1Type, L0Type; CopyOp copyOp; copyOp(dstL0ATensor, srcL1Tensor, layoutDst, layoutSrc);zN → zN 搬运Ascend950非 TLAusing L1Type Gemm::GemmTypehalf, layout::zN, AscendC::TPosition::A1; auto layoutSrc layout::zN::MakeLayouthalf(row, col); auto layoutDst layout::zN::MakeLayouthalf(row, col); // Ascend950 的 L0Type 可省略自动推导对应 layout using CopyOp CopyL1ToL0AArch::Ascend950, L1Type; CopyOp copyOp; copyOp(dstL0ATensor, srcL1Tensor, layoutDst, layoutSrc);【免费下载链接】catlass本项目是CANN的算子模板库提供NPU上高性能矩阵乘及其相关融合类算子模板样例。项目地址: https://gitcode.com/cann/catlass创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考