zoukankan      html  css  js  c++  java
  • 读书笔记 《大话处理器 》 第六章:编写高效代码

    一、软件效率

             软件性能剖析工具分析每个函数(有的工具能分析到每个循环)的执行时间。性能剖析软件:IBM(Rational Quantify)、Intel(VTune)、AMD(CodeAnalyst),DSP集成环境自带。

    二、减少指令数

      1. 使用更快的算法

        快排,FFT算法

      2. 选用合适的指令

      3. 降低数据精度

      4. 减少函数调用

               a. 将小函数直接写成语句;

               b. 将小函数写成宏;

               c. 将函数声明为内联函数;

      5. 空间交换时间

        将中间结果保存(Google等搜索引擎算法)

      6. 减少过保护

        性能实在吃紧时,可以去掉冗余功能(函数参数检查、异常检测)

    三、减少处理器不擅长的操作

      1. 少用乘法(移位)

      2. 少用除法、求余(转为乘法)

      3. 在精度允许的条件下,将浮点数定点化

      4. 尽量减少分支(跳转语句会打乱流水线正常执行,影响效率)

      5. 将最有可能进入的分支放在if中,而不是else中(对应于CPU的分支预测单元 -- 静态预测器)

    四、优化内存访问

      1. 少使用数组,少使用指针(大块数据会被放在存储器中,简单局部变量才会放在寄存器中。)

      2. 少使用全局变量(全局变量因为要被多个模块使用,不会放在寄存器中。)

      3. 一次多访问一些数据

      4. 数据对齐访问(对于n字节的变量,它的起始地址应该为n的整数倍)

      5. 大数据结构时的Cacheline对齐

        Intel处理器的Cache Line大多为64 byte,在对大数据结构分配内存时,起始地址最好为64 byte的整数倍,这样Cache Miss的次数最少。

      6. 程序、数据访问符合Cache的时间、空间局部性

        将在一起使用的的数据放在一起能减少Cache Miss,经常执行的代码放在一起也能减少Cache Miss。

      7. 多线程编程时,避免False Sharing(假共享)

        False Sharing:线程间从算法上并不需要共享变量,但实际执行时,它们所用的数据处于同一个Cache Line中,就会引起Cache冲突。

        多线程编程不可避免的要遇到数据共享,编程时应该注意:尽量少共享数据,尽量少修改数据,尽量少频繁地修改数据。

      8. 自己管理内存的动态分配(频繁的动态分配和释放内存所带来的危害,链表的例子(free list 结构))

      9. 隐藏数据搬移时间(如果处理器支持可寻址的SRAM,用DMA将SRAM中数据搬移到处理器。Cache预取机制)

    五、充分利用编译期进行优化

      1. 编译器的结构(编译原理与编译器构造,前端与后端)      

      2. 编译器提供的优化选项(根据具体情况适度优化,优化会增加程序空间)

      3. 编译器能计算常量

      4. 简单的表达式化简(消除重复的计算)

      5. 提取公共代码(把两个分支中的公共代码提到外面)

      6. 循环展开、软件流水(在循环代码前通过预编译指令告诉编译器一些信息)

      7. 自动向量化(优化为SIMD指令,也需要预编译指令)

      8. 高效的数据组织(为程序中对变量、函数分配合适的存储空间,减少Cache miss)

      9. 指令并行化

        通过分析指令的相关性,实现乱序调度,将指令并行化。为了更好地并行化,编写高级代码时要减少数据依赖。

      10. 编译器更懂处理器

    六、 利用多核来加速程序

      1. 并行计算

        分工(任务划分:各个核执行的代码一样。数据划分:代码一样,处理的数据不同。数据流划分:流水线思想。

        Amdahl’s Law(阿姆达尔定律) 并行的效率:可并行部分占总过程的比例;并行的程度。

      2. 多线程编程

        注意:线程间的同步、负载均衡、可扩展性。 

      3. OpenMP(并行编程架构,专为共享内存系统而设计,适用于多核处理器)

  • 相关阅读:
    Vue(小案例_vue+axios仿手机app)_go实现退回上一个路由
    nyoj 635 Oh, my goddess
    nyoj 587 blockhouses
    nyoj 483 Nightmare
    nyoj 592 spiral grid
    nyoj 927 The partial sum problem
    nyoj 523 亡命逃窜
    nyoj 929 密码宝盒
    nyoj 999 师傅又被妖怪抓走了
    nyoj 293 Sticks
  • 原文地址:https://www.cnblogs.com/MuyouSome/p/3112557.html
Copyright © 2011-2022 走看看