产品 |
是否支持 |
|---|---|
Ascend 950PR/Ascend 950DT |
√ |
√ |
|
√ |
|
√ |
|
x |
|
x |
|
x |
该接口提供数据非对齐搬运的功能,其中从Global Memory搬运数据至Local Memory时,可以根据开发者的需要自行填充数据。
1 2 | template <typename T, PaddingMode mode = PaddingMode::Normal> __aicore__ inline void DataCopyPad(const LocalTensor<T>& dst, const GlobalTensor<T>& src, const DataCopyExtParams& dataCopyParams, const DataCopyPadExtParams<T>& padParams) |
1 2 | template <typename T> __aicore__ inline void DataCopyPad(const LocalTensor<T>& dst, const GlobalTensor<T>& src, const DataCopyExtParams& dataCopyParams, const DataCopyPadExtParams<T>& padParams) |
1 2 | template <typename T, PaddingMode mode = PaddingMode::Normal> __aicore__ inline void DataCopyPad(const GlobalTensor<T>& dst, const LocalTensor<T>& src, const DataCopyExtParams& dataCopyParams) |
1 2 | template <typename T> __aicore__ inline void DataCopyPad(const GlobalTensor<T>& dst, const LocalTensor<T>& src, const DataCopyExtParams& dataCopyParams) |
1 2 | template <typename T> __aicore__ inline void DataCopyPad(const LocalTensor<T>& dst, const LocalTensor<T>& src, const DataCopyExtParams& dataCopyParams, const Nd2NzParams& nd2nzParams) |
1 2 | template<typename T, PaddingMode mode = PaddingMode::Normal> __aicore__ inline void DataCopyPad(const LocalTensor<T>& dst, const GlobalTensor<T>& src, const DataCopyParams& dataCopyParams, const DataCopyPadParams& padParams) |
1 2 | template<typename T> __aicore__ inline void DataCopyPad(const LocalTensor<T>& dst, const GlobalTensor<T>& src, const DataCopyParams& dataCopyParams, const DataCopyPadParams& padParams) |
1 2 | template<typename T, PaddingMode mode = PaddingMode::Normal> __aicore__ inline void DataCopyPad(const GlobalTensor<T>& dst, const LocalTensor<T>& src,const DataCopyParams& dataCopyParams) |
1 2 | template<typename T> __aicore__ inline void DataCopyPad(const GlobalTensor<T>& dst, const LocalTensor<T>& src,const DataCopyParams& dataCopyParams) |
1 2 | template<typename T> __aicore__ inline void DataCopyPad(const LocalTensor<T>& dst, const LocalTensor<T>& src, const DataCopyParams& dataCopyParams, const Nd2NzParams& nd2nzParams) |
不同产品型号对函数原型的支持存在差异,请参考下表中的支持度信息,选择产品型号支持的函数原型进行开发。
产品型号 |
支持的数据传输通路 |
是否支持设置数据搬运模式mode(搬运模式包括单次搬运对齐和整块数据搬运对齐) |
|---|---|---|
Ascend 950PR/Ascend 950DT |
GM->VECIN/VECOUT、GM->A1/B1、GM->TSCM、VECIN/VECOUT->GM、A1/B1->GM、VECIN/VECOUT->TSCM、 GM->VECCALC |
是 |
GM->VECIN/VECOUT、VECIN/VECOUT->GM、VECIN/VECOUT->TSCM |
否 |
|
GM->VECIN/VECOUT、VECIN/VECOUT->GM、VECIN/VECOUT->TSCM |
否 |
|
GM->VECIN/VECOUT、VECIN/VECOUT->GM |
否 |
参数名 |
描述 |
||
|---|---|---|---|
T |
操作数以及paddingValue(待填充数据值)的数据类型。 Ascend 950PR/Ascend 950DT,支持的数据类型为:bool/int8_t/uint8_t/int16_t/uint16_t/half/bfloat16_t/int32_t/uint32_t/float/complex32/int64_t/uint64_t/double/complex64 |
||
mode |
配置数据搬运模式。PaddingMode类型,定义如下:
|
参数名 |
输入/输出 |
描述 |
|---|---|---|
dst |
输出 |
目的操作数,类型为LocalTensor或GlobalTensor。 LocalTensor的起始地址需要保证32字节对齐。 GlobalTensor的起始地址无地址对齐约束。 |
src |
输入 |
源操作数,类型为LocalTensor或GlobalTensor。 LocalTensor的起始地址需要保证32字节对齐。 GlobalTensor的起始地址无地址对齐约束。 |
dataCopyParams |
输入 |
搬运参数。 |
padParams |
输入 |
从Global Memory搬运数据至Local Memory时,可以根据开发者需要,在搬运数据左边或右边填充数据。padParams是用于控制数据填充过程的参数。 |
nd2nzParams |
输入 |
从VECIN/VECOUT->TSCM进行数据搬运时,可以进行ND到NZ的数据格式转换。nd2nzParams是用于控制数据格式转换的参数,Nd2NzParams类型,具体参数请参考表3。 注意:Nd2NzParams的ndNum仅支持设置为1。 |
下文表格中列出的结构体参数定义请参考${INSTALL_DIR}/include/ascendc/basic_api/interface/kernel_struct_data_copy.h,${INSTALL_DIR}请替换为CANN软件安装后文件存储路径。
参数名称 |
含义 |
|---|---|
blockCount |
指定该指令包含的连续传输数据块个数,数据类型为uint16_t,取值范围:blockCount∈[1, 4095]。 |
blockLen |
指定该指令每个连续传输数据块长度,该指令支持非对齐搬运,每个连续传输数据块长度单位为字节。数据类型为uint32_t,取值范围:blockLen∈[1, 2097151],blockLen必须是 sizeof(T) 的整数倍,需要注意UB不要超限。 |
srcStride |
源操作数,相邻连续数据块的间隔(前面一个数据块的尾与后面数据块的头的间隔)。 如果源操作数的逻辑位置为VECIN/VECOUT,则单位为dataBlock(32字节)。如果源操作数的逻辑位置为GM,则单位为字节。 数据类型为uint32_t,srcStride不要超出该数据类型的取值范围。 特别地,针对如下型号: Ascend 950PR/Ascend 950DT 数据类型为int64_t,如果源操作数的逻辑位置为VECIN/VECOUT,取值范围为[0, 65535];如果源操作数的逻辑位置为GM,取值范围为[-blockLen, 2^40-1]。 |
dstStride |
目的操作数,相邻连续数据块间的间隔(前面一个数据块的尾与后面数据块的头的间隔)。 如果目的操作数的逻辑位置为VECIN/VECOUT,则单位为dataBlock(32字节),如果目的操作数的逻辑位置为GM,则单位为字节。 数据类型为uint32_t,dstStride不要超出该数据类型的取值范围。 特别地,针对如下型号: Ascend 950PR/Ascend 950DT 数据类型为int64_t,如果目的操作数的逻辑位置为VECIN/VECOUT,取值范围为[0, 65535];如果目的操作数的逻辑位置为GM,取值范围为[0, 2^40-1]。 |
rsv |
保留字段。 |
参数名称 |
含义 |
|---|---|
blockCount |
指定该指令包含的连续传输数据块个数,数据类型为uint16_t,取值范围:blockCount∈[1, 4095]。 |
blockLen |
指定该指令每个连续传输数据块长度,该指令支持非对齐搬运,每个连续传输数据块长度单位为字节。数据类型为uint16_t,blockLen不要超出该数据类型的取值范围,blockLen必须是 sizeof(T) 的整数倍。 |
srcStride |
源操作数,相邻连续数据块的间隔(前面一个数据块的尾与后面数据块的头的间隔),如果源操作数的逻辑位置为VECIN/VECOUT,则单位为dataBlock(32字节)。如果源操作数的逻辑位置为GM,则单位为字节。数据类型为uint16_t,srcStride不要超出该数据类型的取值范围。 |
dstStride |
目的操作数,相邻连续数据块间的间隔(前面一个数据块的尾与后面数据块的头的间隔),如果目的操作数的逻辑位置为VECIN/VECOUT,则单位为dataBlock(32字节),如果目的操作数的逻辑位置为GM,则单位为字节。数据类型为uint16_t,dstStride不要超出该数据类型的取值范围。 |
参数名称 |
含义 |
|---|---|
isPad |
是否需要填充用户自定义的数据,取值范围:true,false。 true:填充padding value。 false:表示用户不需要指定填充值,会默认填充随机值。 |
leftPadding |
连续搬运数据块左侧需要补充的数据范围,单位为元素个数。 leftPadding、rightPadding所占的字节数均不能超过32字节。 |
rightPadding |
连续搬运数据块右侧需要补充的数据范围,单位为元素个数。 leftPadding、rightPadding所占的字节数均不能超过32字节。 |
paddingValue |
左右两侧需要填充的数据值,需要保证在数据占用字节范围内。 数据类型和源操作数保持一致,T数据类型。 当数据类型长度为64位时,该参数只能设置为0。 |
参数名称 |
含义 |
|---|---|
isPad |
是否需要填充用户自定义的数据,取值范围:true,false。 true:填充padding value。 false:表示用户不需要指定填充值,会默认填充随机值。 |
leftPadding |
连续搬运数据块左侧需要补充的数据范围,单位为元素个数。 leftPadding、rightPadding所占的字节数均不能超过32字节。 |
rightPadding |
连续搬运数据块右侧需要补充的数据范围,单位为元素个数。 leftPadding、rightPadding所占的字节数均不能超过32字节。 |
paddingValue |
左右两侧需要填充的数据值,需要保证在数据占用字节范围内。 uint64_t数据类型,且该参数只能设置为0。 |
下面分别给出如下场景的配置示例:




注意:内部实现涉及AIC和AIV之间的通信,实际搬运路径为VECIN/VECOUT->GM->TSCM,发送通信消息会有开销,性能会受到影响。
如图1 VECIN/VECOUT->TSCM搬运示意图所示,展示了从VECIN/VECOUT搬运到GM,再搬运到TSCM的过程:示例中数据类型为half,单个datablock(32字节)含有16个half元素,源操作数中的A1~A6、B1~B6、C1~C6为需要进行搬运的数据。
blockLen为48,每个连续传输数据块包含48字节;srcStride为0,因为源操作数的逻辑位置为GM,srcStride的单位为字节,即源操作数相邻数据块之间紧密排列;dstStride为0,因为目的操作数的逻辑位置为VECIN、VECOUT,dstStride的单位为DataBlock(32字节),目的操作数相邻数据块之间无间隔,注意数据块包含leftPadding/rightPadding数据。
blockLen + leftPadding + rightPadding满足32字节对齐,isPad为false,左右两侧填充的数据值会默认为随机值,否则为paddingValue。此处示例中,leftPadding为0,rightPadding为16,每个连续传输数据块都会在右侧填充16字节。目的操作数的总长度为192字节。
blockLen为48,每个连续传输数据块包含48字节;srcStride为0,因为源操作数的逻辑位置为GM,srcStride的单位为字节,即源操作数相邻数据块之间紧密排列;dstStride为0,因为目的操作数的逻辑位置为VECIN、VECOUT,dstStride的单位为DataBlock(32字节),目的操作数相邻数据块之间紧密排列,不会填充数据
blockLen * blockCount + leftPadding + rightPadding 满足32字节对齐,isPad为false,左右两侧填充的数据值会默认为随机值,否则为paddingValue。此处示例中,leftPadding为0,rightPadding为16,在最后一个数据块右侧填充16字节。目的操作数的总长度为160字节。

无
1 2 3 4 | AscendC::DataCopyExtParams copyParams{1, 20 * sizeof(half), 0, 0, 0}; AscendC::DataCopyPadExtParams<half> padParams{true, 0, 2, 0}; // 从GM->VECIN搬运40字节 AscendC::DataCopyPad(dstGlobal, src0Global, copyParams, padParams); |
输入数据src0Global: [1 2 3 ... 32] 输出数据dstGlobal:[1 2 3 ... 20]