Ascend C:GMToL1非对齐数据搬运

Ascend C:GMToL1非对齐数据搬运
# GMToL1非对齐数据搬运DataCopyPad【免费下载链接】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 训练系列产品不支持功能说明该接口提供从Global Memory到L1 Buffer的数据非对齐搬运功能可以根据开发者的需要自行填充数据。函数原型template typename T, PaddingMode mode PaddingMode::Normal __aicore__ inline void DataCopyPad(const LocalTensorT dst, const GlobalTensorT src, const DataCopyExtParams dataCopyParams, const DataCopyPadExtParamsT padParams)参数说明表 1模板参数说明参数名描述T操作数以及paddingValue待填充数据值的数据类型。mode配置数据搬运模式。PaddingMode类型定义如下enum class PaddingMode : uint8_t {Normal 0, // 默认模式与原有数据搬运格式保持一致每次数据搬运都会补齐至32字节对齐Compact, // 紧凑模式允许单次搬运不对齐统一在整块数据末尾补齐至32字节对齐};表 2接口参数说明参数名输入/输出描述dst输出目的操作数类型为LocalTensor。LocalTensor的起始地址需要保证32字节对齐。src输入源操作数类型为GlobalTensor。GlobalTensor的起始地址需要保证1字节对齐。dataCopyParams输入搬运参数。• DataCopyExtParams类型具体参数说明请参考表4。padParams输入从Global Memory搬运数据至Local Memory时可以根据开发者需要在搬运数据左边或右边填充数据。padParams是用于控制数据填充过程的参数。• DataCopyPadExtParams类型具体参数请参考表6。表 3DataCopyExtParams结构体参数定义参数名称含义blockCount指定该指令包含的连续传输数据块个数数据类型为uint16_t取值范围blockCount∈[1, 4095]。blockLen指定该指令每个连续传输数据块长度该指令支持非对齐搬运每个连续传输数据块长度单位为字节。数据类型为uint32_t取值范围blockLen∈[1, 2097151]blockLen必须是sizeof(T)的整数倍。srcStride源操作数相邻连续数据块的间隔前面一个数据块的尾与后面数据块的头的间隔单位为字节取值范围为[-blockLen, 2^40-1]。dstStride目的操作数相邻连续数据块间的间隔前面一个数据块的尾与后面数据块的头的间隔单位为dataBlock(32字节)取值范围为[0, 65535]。rsv保留字段。表 4DataCopyPadExtParamsT结构体参数定义参数名称含义isPad是否需要填充用户自定义的数据取值范围truefalse。• true填充padding value。• false表示用户不需要指定填充值会默认填充随机值。leftPadding连续搬运数据块左侧需要补充的数据范围单位为元素个数。leftPadding、rightPadding所占的字节数均不能超过32字节。Compact模式下leftPadding、rightPadding均不生效仅在整块数据末尾统一补齐至32字节对齐。rightPadding连续搬运数据块右侧需要补充的数据范围单位为元素个数。leftPadding、rightPadding所占的字节数均不能超过32字节。Compact模式下leftPadding、rightPadding均不生效仅在整块数据末尾统一补齐至32字节对齐。paddingValue左右两侧需要填充的数据值需要保证在数据占用字节范围内。数据类型和源操作数保持一致T数据类型。当数据类型长度为64位时该参数只能设置为0。下面给出如下场景的配置示例搬运模式的配置示例Normal模式blockLen为48每个连续传输数据块包含48字节srcStride为0因为源操作数的逻辑位置为GMsrcStride的单位为字节即源操作数相邻数据块之间紧密排列dstStride为0因为目的操作数的逻辑位置为L1 BufferdstStride的单位为DataBlock32字节目的操作数相邻数据块之间无间隔注意数据块包含leftPadding/rightPadding数据。blockLen leftPadding rightPadding满足32字节对齐isPad为false左右两侧填充的数据值会默认为随机值否则为paddingValue。此处示例中leftPadding为0rightPadding为16每个连续传输数据块都会在右侧填充16字节。目的操作数的总长度为192字节。Compact模式blockLen为48每个连续传输数据块包含48字节srcStride为0因为源操作数的逻辑位置为GMsrcStride的单位为字节即源操作数相邻数据块之间紧密排列dstStride为0因为目的操作数的逻辑位置为L1 BufferdstStride的单位为DataBlock32字节目的操作数相邻数据块之间紧密排列不会填充数据。Compact模式下leftPadding、rightPadding均不生效有效数据紧密排列后统一在整块数据末尾补齐至32字节对齐。此处示例中blockLen * blockCount 48 * 3 144字节在整块数据末尾补齐16字节满足32字节对齐目的操作数的总长度为160字节。图 1Normal模式与Compact模式搬运配置示意图![](https://raw.gitcode.com/cann/asc-devkit/raw/1cd1d1192e01ae4a8684cd07552c35e13e5c4bdf/docs/zh/api/figures/paddingMode.png Normal模式与Compact模式搬运配置示意图?utm_sourcegitcode_repo_files)数据类型支持的数据类型为bool、int8_t、uint8_t、int16_t、uint16_t、half、bfloat16_t、int32_t、uint32_t、float、complex32、int64_t、uint64_t、double、complex64。返回值说明无约束说明leftPadding、rightPadding的字节数均不能超过32字节。调用示例示例场景如图 1所示该接口仅支持Ascend 950PR/Ascend 950DT。Normal模式调用示例如下constexpr uint32_t srcElemCount 144; constexpr uint32_t dstElemCount 192; // 源操作数GM上连续存放3个数据块每块48B共144个int8_t。 AscendC::GlobalTensorint8_t srcGm; srcGm.SetGlobalBuffer((__gm__ int8_t *)src, srcElemCount); // 目的操作数L1 Buffer。Normal模式下每块48B有效数据右侧补16B3块共192B。 AscendC::LocalTensorint8_t dstLocal(AscendC::TPosition::A1, 0, dstElemCount); AscendC::DataCopyExtParams copyParams; // 搬运3个连续传输数据块。 copyParams.blockCount 3; // 每个连续传输数据块包含48B有效数据。 copyParams.blockLen 48; // 源操作数在GM单位为字节相邻数据块紧密排列间隔为0B。 copyParams.srcStride 0; // 目的端A1相邻数据块无额外间隔dstStride的单位为DataBlock32字节。 copyParams.dstStride 0; // 保留字段固定填0。 copyParams.rsv 0; AscendC::DataCopyPadExtParamsint8_t padParams; // padding区域使用默认随机值不使用paddingValue。 padParams.isPad false; // 左侧不填充GM数据直接从每个目的数据块起始位置写入。 padParams.leftPadding 0; // 每块右侧填充16个int8_t即16B48B 16B 64B满足32B对齐。 padParams.rightPadding 16; // isPad false 时该值不生效填0保持字段完整。 padParams.paddingValue static_castint8_t(0); AscendC::DataCopyPadint8_t, AscendC::PaddingMode::Normal(dstLocal, srcGm, copyParams, padParams);Compact模式调用示例如下constexpr uint32_t srcElemCount 144; constexpr uint32_t dstElemCount 160; // 源操作数GM上连续存放3个数据块每块48B共144个int8_t。 AscendC::GlobalTensorint8_t srcGm; srcGm.SetGlobalBuffer((__gm__ int8_t *)src, srcElemCount); // 目的操作数L1 Buffer的A1位置。Compact模式下3块有效数据共144B只在最后右侧补16B。 AscendC::LocalTensorint8_t dstLocal(AscendC::TPosition::A1, 0, dstElemCount); AscendC::DataCopyExtParams copyParams; // 搬运3个连续传输数据块。 copyParams.blockCount 3; // 每个连续传输数据块包含48B有效数据。 copyParams.blockLen 48; // 源操作数在GM单位为字节相邻数据块紧密排列间隔为0B。 copyParams.srcStride 0; // Compact模式下目的端有效数据紧密排列不在每块之间插入padding间隔。 copyParams.dstStride 0; // 保留字段固定填0。 copyParams.rsv 0; AscendC::DataCopyPadExtParamsint8_t padParams; // padding区域使用默认随机值不使用paddingValue。 padParams.isPad false; // isPad false时该值不生效填0保持字段完整。 padParams.paddingValue static_castint8_t(0); AscendC::DataCopyPadint8_t, AscendC::PaddingMode::Compact(dstLocal, srcGm, copyParams, padParams);【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考