CPU性能优化手段-缓存

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

多级缓存

L1 Cache(一级缓存)是CPU第一层高速缓存,分为数据缓存和指令缓存。一般服务器CPU的L1缓存的容量通常在32-4096KB。

L2由于L1级高速缓存容量的限制,为了再次提高CPU的运算速度,在CPU外部放置-高速存储器,即二级缓存。

L3现在的都是内置的。而它的实际作用即是,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核心)间缓存的数据也不是实时同步。

在同一个时间点,各CPU所看到同一内存地址的数据的值可能是不一致的。

2、CPU执行指令重排序优化下有一个问题:

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

内存屏障

处理器提供了两个内存屏障指令(Memory Barrier)用于解决上述两个问题:

写内存屏障(Store Memory Barrier):在指令后插入Store Barrier,能让写入缓存中的最新数据更新写入主内存,让其他线程可见。强制写入主内存,这种显示调用,CPU就不会因为性能考虑而去对指令重排。

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

转载于:https://www.cnblogs.com/loveyous/p/11426779.html

CPU缓存和内存屏障相关推荐

  1. CPU高速缓存和内存屏障

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

  2. [zz]Memory Barriers(内存屏障): a Hardware View for Software Hackers 阅读笔记

    Memory Barriers: a Hardware View for Software Hackers(原文地址:http://www.puppetmastertrading.com/images ...

  3. Memory Barriers(内存屏障): a Hardware View for Software Hackers 阅读笔记

    Memory Barriers: a Hardware View for Software Hackers(原文地址:http://www.puppetmastertrading.com/images ...

  4. 汇编为什么分段执行总是执行不了_iOS汇编教程(六)CPU 指令重排与内存屏障...

    系列文章 iOS 汇编入门教程(一)ARM64 汇编基础 iOS 汇编入门教程(二)在 Xcode 工程中嵌入汇编代码 iOS 汇编入门教程(三)汇编中的 Section 与数据存取 iOS 汇编教程 ...

  5. CPU和CPU寄存器和CPU缓存和CPU内存管理器、RAM、hard disk。以及堆栈、内存映射。

    CPU registers cpu寄存器 包含通用寄存器,状态寄存器 Cache cpu缓存 RAM 内存 hard disk 硬盘 我们常常看到 32位 CPU.64位 CPU 这样的名称,其实指的 ...

  6. java内存栅栏_内存屏障(Memory Barriers/Fences) - 并发编程中最基础的一项技术

    我们经常都听到并发编程,但很多人都被其高大上的感觉迷惑而停留在知道听说这一层面,下面我们就来讨论并发编程中最基础的一项技术:内存屏障或内存栅栏,也就是让一个CPU处理单元中的内存状态对其它处理单元可见 ...

  7. # 内存屏障:骇客的硬件视角(1)

    翻译自内存屏障 那么到底是什么让CPU的设计大师们着了魔,要把内存屏障这个鬼东西强行塞给了毫不知情的多处理器系统的软件开发者? 简单点说,就是因为内存访问顺序的重排会带来更好的性能.同步原语的正确操作 ...

  8. 【Java】Volitile的作用、JVM规范如何要求内存屏障、硬件层级内存屏障如何帮助java实现高并发 - 第二天笔记

    第二天笔记 Volitile的使用 保持线程可见性 禁止指令重排:单线程中,两条指令的执行前后顺序不会影响执行结果,CPU流水线会优化执行顺序 如果存在乱序,则不可能出现x=0,y=0的结果 运行结果 ...

  9. LINUX内核内存屏障

    ================= LINUX内核内存屏障 ================= By: David Howells <dhowells@redhat.com> Paul E ...

最新文章

  1. C# GDI+ 简单绘图 (三) 仿浏览器截屏效果
  2. Spring IOC和MVC基础知识
  3. 在 ns-3.25中添加 plc(电力线载波) 模块
  4. 3. 什么是icmp?icmp与ip的关系_你知道如何跟女生,确定恋人关系吗?
  5. C++匿名函数Lambda
  6. java查看蓝牙mac地址_Java如何获取主机的MAC地址?
  7. C# 获取COM控件注册状态,注册以及反注册COM控件
  8. Android现学现用第十一天
  9. Genymotion安装apk问题,不能部署Genymotion-ARM-Translation_v1.zip
  10. 常见debug指令和使用
  11. 一张图看懂零维到十维空间
  12. 穿越熊市?用 Python 自制指数估值图
  13. IAP商品修改和数据获取,一文带你全部搞懂
  14. 借助Hugo和Academic主题在github.io建立个人网站
  15. 我的世界电脑服务器怎么显示键盘,我的世界基本操作按键 PC版基本操作详细介绍...
  16. SELECT TOP 100 PERCENT * 的含义
  17. 阿里云服务器发送邮件报错Couldn’t connect to host, port: smtp.qq.com, 25
  18. 神经网络算法有哪几种,神经网络有哪几种算法
  19. springmvc生成二维码
  20. 小程序如何开发商城系统

热门文章

  1. Java 中JProgressBar,Java JProgressBar
  2. 阿里凑单算法首次公开!打包购商品挖掘系统解析
  3. info java module_JAVA新特性视频教学:第三天_21_认识module-info.java文件.mp4
  4. 《巫师 3:狂猎》:传统叙事在开放世界中的水土不服
  5. 为游戏开发者总结的20个 Unity 建议和技巧
  6. Linux学习笔记03
  7. vue全局路由守卫beforeEach
  8. 003 Rabbitmq中交换机的类型
  9. 七天开发安卓软件(五)
  10. Fragment 生命周期: