zoukankan      html  css  js  c++  java
  • cpu性能优化手段

    1  cpu优化:  缓存

    为了提高程序的运行的性能,现代cpu在很多方面对程序进行优化:

    例如:cpu的高速缓存,尽可能的避免处理器访问主内存的时间开销,处理器大多会利用缓存来提高性能

    cpu缓存分为三级缓存:

      L1   一级缓存是cpu第一层高速缓存 分为数据缓存和指令缓存 一般服务器的cpu在32-4.96kb

      L2   为了提高cpu的运算速度,在cpu外部放置高速存储器 即二级缓存

      L3   现在都是内置的,作用,可以进一步降低内存的延迟,同时提升大数据计算时候处理器的性能,一般死多核公用l3缓存

    多处理器时候  单个cpu对缓存中的数据进行改动了,需要通知给其他的cpu  也就意味者,cpu的处理器要控制自己的读写操作

    还要监听其他cpu的发出的通知,从而保证缓存的一致性

    2 cpu优化:指令重排

     指令重排的场景:当cpu的写缓存时候发现缓存区域正在被其他cpu占用,为了提高cpu的性能,可能会将后面的都缓存指令优先执行

    并非随便重排:需要遵循as-if -serial语义

    as-if -serial语义是指: 不管怎么重排序,程序的执行结果不会被改变,编译器和处理器都会遵循这个语义

    也就是说,编译器和处理器不会对数据存在对的依赖关系的操作做重排序

    存在问题:

    1 cpu高速缓存下问题:

      缓存中的数据与主内存的数据并不是实时同步的,各个cpu间的缓存数据也不是实时同步,各个cpu所看到的同一内存数据可能不一致

    2 指令重排:

      虽然遵循的as-if -serial 语义 仅仅在单个cpu自己执行的情况下保证结果正确

      多核多线程 中,指令逻辑无法分辨因果关联 可能会出现程序乱执行,导致程序运行结果错误

    解决方法: cpu提高内存屏障

      1 写内存屏障: 在指令后插入store barrier,能让写入缓存的最新数据更新写入主内存,让其他线程可见

        强制写入主内存,这个现实调用,cpu就不会因为性能问题去对指令重排

      2 读内存屏障:在指令之前插入load barrier  可以让缓存缓存中的数据实现,强制从新主内存加载数据

        强制读取主内存内容,让cpu缓存保持与之内存保持一致,避免了缓存导致的一致性问题

  • 相关阅读:
    [转]读取并修改App.config文件
    [转]线程和进程的概念
    实习日志(3)
    实习日志2
    实习小感,回学校啦~~~~
    请教LUA高手一段代码,希望帮忙谢谢!
    实习的日子
    vs显示 error LNK2019: 无法解析的外部符号 _main解决办法
    创建一个新窗口进程并返回进程ID号和进程的主线程ID号
    显示基本图形界面第一天
  • 原文地址:https://www.cnblogs.com/cxyxiaobao/p/12386125.html
Copyright © 2011-2022 走看看