CPU性能优化手段 - 缓存

为了提高程序的运行性能, 现代CPU在很多方面对程序进行了优化
例如: CPU高速缓存, 尽可能的避免处理器访问主内存的时间开销, 处理器大多会利用缓存以提高性能

多级缓存

L1 Cache (一级缓存)是CPU第一层高速缓存, 分为数据缓存和指令缓存, 一般服务器CPU的L1缓存的容量通常在32-4096kb
L2 Cache (二级缓存) 由于L1高速缓存的容量限制, 为了再次提高CPU的运算速度, 在CPU外部放置一高速缓存存储器, 即二级缓存
L3 Cache(三级缓存)现在都是内置的, 而它的实际作用既是, L3缓存的应用可以进一步降低内存延迟, 同时提升大数据量计算时处理器的性能. 具有较大L3缓存的处理器更有效的文件系统缓存行为及较短消息和处理器队列长度. 一般是多核共享一个L3缓存

CPU在读取数据时, 先在L1中寻找, 再从L2中寻找, 再从L3中寻找, 然后是内存, 最后是外存储器

缓存同步协议

多CPU读取同样的数据进行缓存, 进行不同运算之后, 最终写入主内存以那个CPU为准? 在这种高速缓存回写的场景下, 有一个缓存一致性协议, 多数CPU厂商对它进行了实现.
即MESI协议, 它规定每条缓存有个状态位, 同时定义了下面四种状态:

  • 修改态(Modified) 此cache行已被修改过(脏行), 内容已不同于主内存, 为此cache专有
  • 专有态(Exclusive) 此cache行同于主存, 但它不出现于其他cache中
  • 共享态(Shared) 此cache行同于主存, 但也出现于其他cache中
  • 无效态(Invalid) 此cache行无效(空行)

多处理时, 单个CPU对缓存中的数据进行了改动, 需要通知给其他CPU, 也就意味着, CPU处理要控制自己的读写操作, 还要监听其他CPU发出的通知, 从而保证最终一致

CPU性能优化手段 - 运行时指令重排

指令重排的场景: 当CPU写缓存时发现缓存区块正被其它CPU占用, 为了提高CPU处理性能, 可能将后面的读缓存命令优先执行.
当然也并非随便重排, 需要遵循as-if-serial语义
as-if-serial语义的意思指: 不管怎么重排序, 程序的执行结果不能被改变
编译器, runtime和处理器都必须遵守as-if-serial语义, 也就是说, 编译器和处理器不会对存在数据依赖关系的操作做重排序

两个问题

  1. CPU高速缓存下有一个问题:
    缓存中的数据与主内存的数据并不是实时同步的, 各CPU间缓存的数据也不是实时同步. 在同一时间点, 各CPU所看到的同一内存地址的数据的值可能是不一致的.

  2. CPU执行指令重排序优化的一个问题:
    虽然遵守了as-if-serial语义, 但仅在单CPU自己执行的情况下能保证结果正确. 多核多线程中, 指令逻辑无法分辨因果关联, 可能出现乱序执行, 导致程序运行结果错误

解决方法 - 内存屏障

处理器提供了两个内存屏障指令(Memory Barrier)用于解决上述两个问题:
写内存屏障(Store Memory Barrier): 在指令后插入Store Barrier, 能让写入缓存中的最新数据更新写入主内存, 让其他线程可见
强制写入主内存, 这种显示调用, CPU就不会因为性能考虑而进行指令重排

读内存屏障(Load Memory Barrier): 在指令前插入Load Barrier, 可以让高速缓存中的数据失效, 强制从新从主内存读取数据
强制读取主内存内容, 让CPU缓存和主内存保持一致, 避免了缓存导致的一致性问题

CPU缓存和内存屏障的更多相关文章

  1. LINUX内核内存屏障

    =================                          LINUX内核内存屏障                          ================= By ...

  2. volatile 和 内存屏障

    接下来看看volatile是如何解决上面两个问题的: 被volatile修饰的变量在编译成字节码文件时会多个lock指令,该指令在执行过程中会生成相应的内存屏障,以此来解决可见性跟重排序的问题. 内存 ...

  3. volatile关键字?MESI协议?指令重排?内存屏障?这都是啥玩意

    一.摘要 三级缓存,MESI缓存一致性协议,指令重排,内存屏障,JMM,volatile.单拿一个出来,想必大家对这些概念应该有一定了解.但是这些东西有什么必然的联系,或者他们之间究竟有什么前世今生想 ...

  4. 【C# 线程】内存屏障 MemoryBarrier

    背景 同步基元分为用户模式和内核模式 用户模式:Iterlocked.Exchange(互锁).SpinLocked(自旋锁).易变构造(volatile关键字.volatile类.Thread.Vo ...

  5. 内存屏障和volatile内存语义的实现

    趁周末,把以前的书拿出来,再翻一番,顺便做个笔记: 内存屏障:用来控制和规范cpu对内存操作的顺序的cpu指令. 内存屏障列表: 1.loadload:确保“前者数据装载”先于“后者装载指令”: 2. ...

  6. 为什么CPU缓存会分为一级缓存L1、L2、L3?有什么意义?

    https://baijiahao.baidu.com/s?id=1598811284058671259&wfr=spider&for=pc 简介:CPU缓存是CPU一个重要的组成部分 ...

  7. [SPDK/NVMe存储技术分析]006 - 内存屏障(MB)

    在多核(SMP)多线程的情况下,如果不知道CPU乱序执行的话,将会是一场噩梦,因为无论怎么进行代码Review也不可能发现跟内存屏障(MB)相关的Bug.内存屏障分为两类: 跟编译有关的内存屏障: 告 ...

  8. C和C++中的volatile、内存屏障和CPU缓存一致性协议MESI

    目录 1. 前言2 2. 结论2 3. volatile应用场景3 4. 内存屏障(Memory Barrier)4 5. setjmp和longjmp4 1) 结果1(非优化编译:g++ -g -o ...

  9. 多线程 - 内存屏障和cpu缓存

    CPU性能优化 - 缓存 为了提高程序运行的性能,现代CPU在很多方面会对程序进行优化.CPU的处理速度是很快的,内存的速度次之,硬盘速度最慢.在cpu处理内存数据中,内存运行速度太慢,就会拖累cpu ...

随机推荐

  1. WPF生命周期

    App.xaml.cs         重写OnStartup方法,完成初始化 wpf中Window的生命周期    

  2. 一个由单例模式在多线程环境下引发的 bug

    问题症状 HTTP 日志系统,老是出现日志信息覆盖的情况.比如同时调用 A 接口和 B 接口,B 接口请求响应信息变成了 A 接口请求响应相关信息.这个问题在并发量大的情况下越来越严重. 问题初步分析 ...

  3. SQLServer2008-2012开启远程连接的配置方法

    一.远程连接端口设置(很关键的一步)1.在服务器上打开SQL Server Configuration Manager.选择SQL Server配置管理器->SQL Server 网络配置-&g ...

  4. Oracle VM VirtualBox ubuntu 共享文件设置

    1.创建共享文件 2.在本机上选择共享文件路径,虚拟机设置共享文件名称,注意这里不能选择自动挂载 3. 虚拟机新建文件夹挂载共享文件 sudo mkdir /mnt/sharedsudo mount ...

  5. Python写的嗅探器——Pyside,Scapy

    使用Python的Pyside和Scapy写的嗅探器原型,拥有基本框架,但是功能并不十分完善,供参考. import sys import time import binascii from PySi ...

  6. WPF里DataGrid分页控件

    1.主要代码: using System; using System.Collections.ObjectModel; using System.Windows; using System.Windo ...

  7. 解决iconv函数无法转换某些中文的问题

    原文: 解决iconv函数无法转换某些中文的问题 请先看以下代码,这个页面是GB2312编码的: $str = '陶喆';echo 'gb2312-'.$str;echo '<br />' ...

  8. JS function document.onclick(){}报错Syntax error on token "function", delete this token - CSDN博客

    原文:JS function document.onclick(){}报错Syntax error on token "function", delete this token - ...

  9. Delphi用Socket API实现路由追踪

    Windows自带的Tracert是向远程主机发送ICMP包进行追踪,但是目前很多主机关闭了ICMP答复,这个工具不太好使了~~~~~原理咱知道,正规的Trace不就是发送TTL依次递增的UDP包吗? ...

  10. Qt for android触摸手势事件QGestureEvent

    在触摸设备上可以使用Qt的手势事件 要激活手势事件,需要执行以下操作: 第一步,为QWidget控件注册手势事件 QList<Qt::GestureType> gestures; gest ...