cann/asc-devkit:非连续搬运场景减少搬运次数
非连续搬运场景减少搬运次数【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit【优先级】中[!NOTE]说明 该性能优化建议适用于如下产品型号Ascend 950PR/Ascend 950DT在非连续搬运场景可以使用DataCopyPad接口的Loop模式和DataCopy的多维数据搬运接口来减少搬运次数优化搬运性能。使用Loop模式减少非连续搬运的次数【描述】DataCopyPad接口在Normal/Compact模式基础上可以使用Loop模式搬运二维数据假设我们希望以下图的方式搬运8个48B大小的数据块【反例】调用多次搬运接口进行搬运以DataCopyPad为例__aicore__ inline void CopyIn3(){ AscendC::LocalTensorT xLocal inQueueX.AllocTensorT(); AscendC::DuplicateT(xLocal, 0, count); AscendC::DataCopyParams dataCopyParams; dataCopyParams.blockCount 2; dataCopyParams.blockLen 48; dataCopyParams.srcStride 0; dataCopyParams.dstStride 0; AscendC::DataCopyPadParams dataCopyPadParams; dataCopyPadParams.isPad 0; dataCopyPadParams.leftPadding 0; dataCopyPadParams.rightPadding 0; dataCopyPadParams.paddingValue 0; AscendC::DataCopyPadT, AscendC::PaddingMode::Compact(xLocal, xGm, dataCopyParams, dataCopyPadParams); AscendC::DataCopyPadT, AscendC::PaddingMode::Compact(xLocal[32], xGm[24], dataCopyParams, dataCopyPadParams); AscendC::DataCopyPadT, AscendC::PaddingMode::Compact(xLocal[72], xGm[48], dataCopyParams, dataCopyPadParams); AscendC::DataCopyPadT, AscendC::PaddingMode::Compact(xLocal[104], xGm[72], dataCopyParams, dataCopyPadParams); inQueueX.EnQueT(xLocal); }图1使用多次DataCopyPad接口进行搬运![](https://raw.gitcode.com/cann/asc-devkit/raw/ded540824a702f5cab69a36879315c31ce8ff9b7/docs/zh/guide/figures/使用多次DataCopyPad接口进行搬运.png 使用多次DataCopyPad接口进行搬运?utm_sourcegitcode_repo_files)【正例】使用Loop模式进行搬运__aicore__ inline void CopyIn3(){ AscendC::LoopModeParams loopModeParams; loopModeParams.loop1Size 2; loopModeParams.loop2Size 2; loopModeParams.loop1SrcStride 96; loopModeParams.loop1DstStride 128; loopModeParams.loop2SrcStride 192; loopModeParams.loop2DstStride 288; AscendC::LocalTensorT xLocal inQueueX.AllocTensorT(); AscendC::DuplicateT(xLocal, 0, count); AscendC::DataCopyParams dataCopyParams; dataCopyParams.blockCount 2; dataCopyParams.blockLen 48; dataCopyParams.srcStride 0; dataCopyParams.dstStride 0; AscendC::DataCopyPadParams dataCopyPadParams; dataCopyPadParams.isPad 0; dataCopyPadParams.leftPadding 0; dataCopyPadParams.rightPadding 0; dataCopyPadParams.paddingValue 0; AscendC::SetLoopModePara(loopModeParams, AscendC::DataCopyMVType::OUT_TO_UB); AscendC::DataCopyPadT, AscendC::PaddingMode::Compact(xLocal, xGm, dataCopyParams, dataCopyPadParams); AscendC::ResetLoopModePara(AscendC::DataCopyMVType::OUT_TO_UB); inQueueX.EnQueT(xLocal); }图2使用Loop模式进行搬运![](https://raw.gitcode.com/cann/asc-devkit/raw/ded540824a702f5cab69a36879315c31ce8ff9b7/docs/zh/guide/figures/使用Loop模式进行搬运.png 使用Loop模式进行搬运?utm_sourcegitcode_repo_files)【总结】当数据块之间需要插入不同大小Padding时使用Loop模式搬运代替多次的DataCopyPad能够减少搬运指令的使用提升性能。使用多维数据搬运减少非连续搬运次数【描述】假设我们希望以下图的方式搬运2个8B大小的数据块图3搬运前后数据![](https://raw.gitcode.com/cann/asc-devkit/raw/ded540824a702f5cab69a36879315c31ce8ff9b7/docs/zh/guide/figures/搬运前后数据.png 搬运前后数据?utm_sourcegitcode_repo_files)【反例】使用多次DataCopyPad进行搬运图4使用多次DataCopyPad进行搬运![](https://raw.gitcode.com/cann/asc-devkit/raw/ded540824a702f5cab69a36879315c31ce8ff9b7/docs/zh/guide/figures/使用多次DataCopyPad进行搬运.png 使用多次DataCopyPad进行搬运?utm_sourcegitcode_repo_files)__aicore__ inline void CopyIn5(){ AscendC::LocalTensorT xLocal inQueueX.AllocTensorT(); AscendC::DuplicateT(xLocal, 0, count); AscendC::DataCopyParams dataCopyParams; dataCopyParams.blockCount 1; dataCopyParams.blockLen 8; dataCopyParams.srcStride 0; dataCopyParams.dstStride 0; AscendC::DataCopyPadParams dataCopyPadParams; dataCopyPadParams.isPad 1; dataCopyPadParams.leftPadding 5; dataCopyPadParams.rightPadding 1; dataCopyPadParams.paddingValue 0; // 第一次搬运 AscendC::DataCopyPadT, AscendC::PaddingMode::Normal(xLocal, xGm, dataCopyParams, dataCopyPadParams); dataCopyPadParams.isPad 1; dataCopyPadParams.leftPadding 1; dataCopyPadParams.rightPadding 5; dataCopyPadParams.paddingValue 0; // 第二次搬运 AscendC::DataCopyPadT, AscendC::PaddingMode::Normal(xLocal[8], xGm[2], dataCopyParams, dataCopyPadParams); inQueueX.EnQueT(xLocal); }【正例】使用多维数据搬运DataCopy接口在Ascend 950PR/Ascend 950DT上支持多维数据的搬运具体可参考GMToUB多维数据搬运NDDMA(DataCopy).md)。以2D场景的搬运为例代码如下__aicore__ inline void CopyIn6(){ AscendC::LocalTensorT xLocal inQueueX.AllocTensorT(); AscendC::DuplicateT(xLocal, 0, count); AscendC::NdDmaLoopInfo2 loopInfo{{1, 2}, {1, 4}, {2, 2}, {1, 1}, {1, 1}}; AscendC::NdDmaParamsT, 2 params {loopInfo, 0}; AscendC::NdDmaDci(); static constexpr AscendC::NdDmaConfig config {false}; AscendC::DataCopyT, 2, config(xLocal, xGm, params); inQueueX.EnQueT(xLocal); }图5搬运前后数据![](https://raw.gitcode.com/cann/asc-devkit/raw/ded540824a702f5cab69a36879315c31ce8ff9b7/docs/zh/guide/figures/搬运前后数据-56.png 搬运前后数据-56?utm_sourcegitcode_repo_files)【总结】使用多维数据搬运在部分场景下能够减少搬运指令的条数从而提升性能。【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻