网站大量收购独家精品文档,联系QQ:2885784924

高效代码原理与实践.pptVIP

  1. 1、本文档共51页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
高效代码原理与实践 目录 高效源自设计 优化始于剖析 编译器优化的两个障碍 存储器 循环 查表 并行与SIMD 高效源自设计 高效的误区 影响效率的因素 算法的选择 相关与重复 存储器的分配与使用 数据类型的选择 运算技巧 高效的误区 高效的误区 高效的误区 高效的误区 高效的误区 高效三阶段 影响效率的因素 算法的选择 算法的选择 相关与重复 存储器的分配与使用 数据类型的选择 运算技巧 优化始于剖析 问题:某系统中各个模块对时间的占用如下图所示 如果要达到T优化前/T优化后 = 1.1, 那么需要优化几个模块, 每个模块优化多少? 如果T优化前/T优化后为 1.5、2、3、4、5呢? 优化始于剖析 优化始于剖析 优化始于剖析 优化始于剖析 编译器优化的两个障碍 存储器别名 函数调用 编译器优化的两个障碍 下面两个函数哪个效率高? 两个函数是否等价? 编译器优化的两个障碍 编译器优化的两个障碍 下面两个函数哪个效率高? 两个函数是否等价? 编译器优化的两个障碍 编译器优化的两个障碍 编译器优化的两个障碍 存储器 存储器的层次结构 Cache友好的代码 存储器山 局部性 存储器的层次结构 存储器的层次结构 Cache友好的代码 Cache友好的代码 Cache友好的代码 Cache友好的代码 存储器山 局部性 局部性 局部性 循环 查表 查表 并行与SIMD 软件流水 DMA SIMD 软件流水 软件流水 DMA DMA SIMD SIMD 总结 精心设计算法,消除重复运算 在编码设计阶段考虑是否使用DMA 在编码设计阶段考虑是否使用表格 设计小的、小步长的、顺序访问的缓存 养成良好的编程习惯,注意数据类型的选取,边写要顺便消除明显的重复运算,用中间变量代替公共子式 写紧密的、顺序执行的、局部性好的循环 先做剖析,确定优化的重点 使用SIMD、软件流水、DMA等方法提高并行度 The End 结论: 越靠近CPU的存储器,容量越小,速度越快。越远离CPU的存储器,容量越大,但是速度也越慢。 Cache的特性: 当不命中时,会一次性读取该数据及临近的几个数据到cahe中 for (i = 0; i N; i++) { sum += v[i]; } for (j = 0; j N; j++) { for (i = 0;i M; i++) { sum += v[i][j]; } } 这两段代码哪个效率高? for (i = 0; i M; i++) { for (j = 0; j N; j++) { sum += v[i][j]; } } 时间局部性(Temporal locality):如果被访问过的存储器地址在较短时间内被再次访问,则程序具有良好的时间局部性。在一定的时间内,重复访问同一个地址的次数越多,时间局部性越好。换句话说,对同一个地址的两次访问间隔时间越短,时间局部性越好。 空间局部性(Spatial locality):如果程序访问某个存储器地址后,又在较短时间内访问临近的存储器地址,则程序具有良好的空间局部性。两次访问的地址越接近,空间局部性越好。 局部性原理如何体现在代码中? 减少缓存大小,降低访问步长,使用顺序访问而非随机访问 循环中尽量使用较少的变量,同一个变量尽可能地多使用 局部性的一个应用:使用分块来计算矩阵乘法 详见《深入理解计算机系统》P443 循环中只保留与循环变量相关的运算 尽量不要使用break、continue、if 等跳转语句 核心循环中变量尽量少,对arm,建议不超过12个 建议使用i--,不用i++ 表格较小 运算复杂 什么时候使用表格? 访问越频繁,该表格所对应的cache会越来越“热”,cache miss的次数越来越少,到最后相当于该表格被直接放到了cache中,此时访问速度就很快了。这也是局部性的体现。 当表格在一段时间内频繁使用时,效率会比较高。为什么? 循环体尽量小 不使用break、if-else等跳转操作 DMA:Direct Memory Access 不占用CPU资源,直接把数据搬到想放的地方去 DMA的典型用法:把片外数据搬到片内做运算, 运算完之后再搬到片外。 在算法设计阶段就要考虑哪些运算放在片内,如何搬运。 SIMD: single instruction multiple data 例子:_dotpsu4(d, c) 两个像素a、b,用一个4字节整数表示,其中,RGBα各用一个字节表示。 那么,如果要把a、b的对应的R、G、B、α做平均,如何做效率最高? (a b) + (((a ^ b) 0xFEFE

文档评论(0)

shaoye348 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档