当前位置: 首页 > article >正文

Ascend C算子性能优化实用技巧03——搬运优化

Ascend C是CANN针对算子开发场景推出的编程语言,原生支持C和C++标准规范,兼具开发效率和运行性能。使用Ascend C,开发者可以基于昇腾AI硬件,高效的实现自定义的创新算法。

目前已经有越来越多的开发者使用Ascend C,我们将通过几期“Ascend C算子性能优化”专题分享,围绕开发者最为关心的算子性能优化环节,介绍Ascend C算子常用的优化技巧,帮助开发者自主构建出更优性能的算子。专题内容将围绕流水优化、搬运优化、内存优化、API使用优化以及Tiling优化等优化技巧,从方案讲解、优化案例、性能对比等多角度展开介绍。前期内容回顾:

《Ascend C算子性能优化实用技巧01——流水优化》
《Ascend C算子性能优化实用技巧02——内存优化》

下面进入第三期内容:Ascend C搬运优化,您将了解到以下优化技巧:

  1. 尽量一次搬运较大的数据块
  2. GM地址尽量512B对齐
  3. 高效使用搬运API

高效使用搬运API

使用搬运API时,应该尽可能地使用API的srcStride/dstStride/blockLen/blockCount等参数实现连续搬运或者固定间隔搬运,而不是使用for循环,二者效率差距极大。如下图示例,图片的每一行为16KB,需要从每一行中搬运前2KB,针对这种场景,使用srcStride/dstStride/blockLen/blockCount等参数可以达到一次搬完的效果,每次搬运32KB;如果使用for循环遍历每行,每次仅能搬运2KB。参考“尽量一次搬运较大的数据块”章节介绍的搬运数据量和实际带宽的关系,建议通过DataCopy包含srcStride/dstStride/blockLen/blockCount的接口一次搬完。

​​​​​​​图5 待搬运数据排布

【反例】

// 搬运数据存在间隔,从GM上每行16KB中搬运2KB数据, 共16行
LocalTensor<float> tensorIn;
GlobalTensor<float> tensorGM;
...
constexpr int32_t copyWidth = 2 * 1024 / sizeof(float);
constexpr int32_t imgWidth = 16 * 1024 / sizeof(float);
constexpr int32_t imgHeight = 16;
// 使用for循环,每次只能搬运2K,重复16次
for (int i = 0, i < imgHeight; i++) {
    DataCopy(tensorIn[i * copyWidth ], tensorGM[i*imgWidth], copyWidth);
}

【正例】

LocalTensor<float> tensorIn;
GlobalTensor<float> tensorGM;
...
constexpr int32_t copyWidth = 2 * 1024 / sizeof(float);
constexpr int32_t imgWidth = 16 * 1024 / sizeof(float);
constexpr int32_t imgHeight = 16;
// 通过DataCopy包含srcStride/dstStride/blockLen/blockCount的接口一次搬完
DataCopyParams copyParams;
copyParams.blockCount = imgHeight;
copyParams.blockLen = copyWidth / 8;   // 搬运的单位为DataBlock(32Byte),每个DataBlock内有8个float
copyParams.srcStride = (imgWidth  - copyWidth ) / 8;   // 表示两次搬运src之间的间隔,单位为DataBlock
copyParams.dstStride = 0;                              // 连续写,两次搬运之间dst的间隔为0,单位为DataBlock
DataCopy(tensorGM, tensorIn, copyParams);

更多学习资源

了解更多Ascend C算子性能优化手段和实践案例,请访问:昇腾社区Ascend C信息专区。


http://www.kler.cn/a/292300.html

相关文章:

  • MuMu模拟器安卓12安装Xposed 框架
  • AI 写作(九)实战项目二:智能新闻报道(9/10)
  • 【Three.js基础学习】22.New project structure
  • sql在按照当前表查询返回
  • 容器技术在持续集成与持续交付中的应用
  • 企业如何提高招聘能力?
  • leetcode第142题:环形链表 ||(C语言+引申问题全解)
  • ETL数据集成丨SQLServer到Doris的无缝数据同步策略
  • 虚拟机苹果系统MacOS中XCode的安装
  • Spring Boot:医疗排班平台的技术支撑
  • 帆软报表使用url访问报表,自定义前端搜索,优化报表展示
  • 查询数据库版本、查询数据字符集sql
  • 深度学习-用神经网络NN实现足球大小球数据分析软件
  • NAT技术-将多个内部网络设备映射到一个公共IP地址
  • 当小程序遭遇攻击或超出流量峰值时:SCDN边缘加速的高效防护策略!
  • Mysql复杂的查询语句有哪些
  • 这个爬虫工具可以解锁复杂网站,不错~
  • Kafka【九】如何实现数据的幂等性操作
  • 淘宝商品详情API中的优惠券与红包信息解析
  • 《Linux运维总结:基于X86_64+ARM64架构CPU使用docker-compose一键离线部署consul 1.18.1容器版分布式ACL集群》
  • 【专题】2024全球电商消费电子市场研究报告合集PDF分享(附原数据表)
  • Python可视化集大成之作 - Seaborn 介绍
  • 集成电路学习:什么是ROM只读存储器
  • 《中国电化教育》
  • 使用C语言实现字符推箱子游戏
  • 使用Gin框架实现HTTP重定向