并行编程——内存模型之缓存一致性

1  定义

缓存一致性 Cache coherence 简称 CC, 缓存一致性协议是在共享缓存多处理器架构确保最终一致性最突出、最重要的机制。这些协议在缓存线(cache-line)级别实现了对一致性的保证。缓存线是从主内存中读取数据和向内存中写入数据的缓存单位(至少从一致性机制的角度看是这样的)。商用处理器上三个最突出最重要的缓存一致性协议—MOESI, MESI, and MESIF—的缩写都来自它们为缓存线定义的各种状态:Modified(已修改), Owned(被占用),Exclusive(独占的), Shared(共享的), Invalid(无效的), and Forward(转发的)。缓存一致性协议在对内存确保最终一致性的内存一致性机制的帮助下对这些状态进行管理。

 Intel 奔腾: MESI 协议

AMD opteron: MOESI 协议

Intel i7 : MESIF 协议

问题 :为什么需要缓存CC?

答案:

从第二章的体系结构图可以看到,一般每个核心都有一个私有的L1级和L2级Cache,同一个物理CPU上的多个核心共享一个L3级缓存,这样的设计是出于提高内存访问性能的考虑。但是这样就有一个问题了,每个核心之间的私有L1,L2级缓存之间需要同步啊。比如,核心1上的线程A对一个共享变量global_counter进行了加1操作,这个被写入的新值存到核心1的L1缓存里了;此时另一个核心2上的线程B要读global_counter了,但是核心2的L1缓存里的global_counter的值还是旧值,最新被写入的值现在还在核心1上。这就需要CPU有一个模块来保证,同一个内存的数据在同一时刻对任何对其可见的核心看来,数据是一致的,由第二章缓存图知道,这种专门的组件就是缓存控制器(Cbox,Bbox)。

2  CC协议

2.1  MESI 

详细了解参考 : Cache一致性协议之MESI : http://blog.csdn.net/muxiqingyang/article/details/6615199

2.2 MOESI

MOESI 是MESI 的一种拓展

下面是基于MOESI的一个例子,展示的是共享缓存多处理器中共享读写的生命周期。

[http://www.oschina.net/translate/nonblocking-algorithms-and-scalable-multicore-programing]

2.3  MESIF

Intel提出了另外一种MESI协议的变种,即MESIF协议,该协议与MOESI协议有较大的不同,也远比MOESI协议复杂,该协议由Intel的QPI(QuickPath Interconnect)技术引入,其主要目的是解决“基于点到点的全互连处理器系统”的Cache共享一致性问题,而不是“基于共享总线的处理器系统”的Cache共享一致性问题。

在基于点到点互连的NUMA(Non-Uniform Memroy Architecture)处理器系统中,包含多个子处理器系统,这些子处理器系统由多个CPU组成。如果这个处理器系统需要进行全机Cache共享一致性,该处理器系统也被称为ccNUMA(Cache Cohenrent NUMA)处理器系统。MESIF协议主要解决ccNUMA处理器结构的Cache共享一致性问题,这种结构通常使用目录表,而不使用总线监听处理Cache的共享一致性。

 

关于MESIF ,可以参阅陈怀临的 “浅谈intel qpi 的 MESIF 协议和home,soure snoop”

http://www.360doc.com/content/10/1207/13/158286_75798413.shtml

3 伪共享

3.1  定义

从上一节可以知道,缓存一致性协议操作的最小对象的缓存行,缓存行内数据的修改、写入内存、写入其他缓存等操作都会改变其状态,这样,在共享缓存多核架构里,数据结构如果组织不好,就非常容易出现多个核线程反复修改同一条缓存行的数据导致缓存行状态频繁变化从而导致严重性能问题,这就是伪共享现象。

 下图就是一个伪共享的例子,core1上运行的线程想修改变量x,core2上运行的线程想修改变量y,但x和y刚好在一个缓存行上。每个线程都要去竞争缓存行的所有权来更新变量。如果核心1获得了所有权,缓存子系统将会使核心2中对应的缓存行失效。当核心2获得了所有权然后执行更新操作,核心1就要使自己对应的缓存行失效。这会来来回回的经过L3缓存,大大影响了性能。如果互相竞争的核心位于不同的插槽,就要额外横跨插槽连接,问题可能更加严重。

 

3.2  解决

与缓存行导致性能问题的严重相比,对这个问题的解决方案显得非常简单,这就是缓存行填充,通过填充缓存行,使得某个核心线程频繁操作的数据独享缓存行,这样就不会出现伪共享问题了。下面是一个例子。

32位机 long long 是8字节,这样一个缓存行64字节可以存8个 counter, 这样最差的情况下同时会有8个线程争夺同一个缓存行的操作权,性能会非常低。解决方式非常简单,如下图所示,每个counter 变量增加一个填充变量 pad,使得一个counter 变量刚好是一个缓存行大小,这样数组counters 每个元素占用一个缓存行,所有线程独占自己的缓存行,避免了伪共享问题。

转载于:https://www.cnblogs.com/jiayy/p/3246133.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261349.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Start Instance 操作详解 - 每天5分钟玩转 OpenStack(31)

本节通过日志文件详细分析 instance start 操作。下面是 start instance 的流程图向 nova-api 发送请求nova-api 发送消息nova-compute 执行操作下面我们详细讨论每一个步骤。 向 nova-api 发送请求客户(可以是 OpenStack 最终用户,也可以是其他程序&…

失望时想起了你是什么歌_你是空你是空是什么歌 你是风你是风什么歌

“你是空,你是空”“你是风,你是风”“下起雨想起了你”前奏的歌曲最近在抖音受到很多人的喜欢,想要找到完整版歌词作为BGM,这首歌非常的洗脑,你是空你是空是什么歌?你是风什么歌?下面八宝网带来…

ASP.NET MVC从视图传递多个模型到Controller

从后台组织好数据然后传递到页面倒是水到渠成很方便,因为MVC自身就将这样的需求内建到了这个系统中。我只需要在后台组织好一个List 或IEnumerable类型的变量,将需要传递的数据模型扔进去便可。 比如这里我们向视图返回5条product信息在页面进行展示&…

还原virtual函数的本质-----C++

当你每次看到C类中声明一个virtual函数,特别是看到了一个virtual的虚构函数。你知道它的意思吗?你肯定会毫不犹豫的回答:不就是多态么。。。在运行时确定具体的行为么。。。完全正确,但这里我要讲的不只是这些东西。 有些类需要虚…

0511 backlog 项目管理

SCRUM 这次的作业就是确定SCRUM的计划,确定sprint backlog的一个冲刺周期,而这个周期是两个星期。争取在两周内发布1.0版本。 本次作业以网站构建为主: ID NAMEIMPESTHOW TO DONOTES1首页99小时用户登录网站也可以看游客的推广的内容&am…

4月27日微软云训练营活动-现场图集

1.签到 2.到场同学,这一天是工作日,但是人气依然很火。 转载于:https://www.cnblogs.com/finehappy/p/3262296.html

Java中内存中的Heap、Stack与程序运行的关系

堆和栈的内存管理 栈的内存管理是顺序分配的,而且定长,不存在内存回收问题;而堆 则是随机分配内存,不定长度,存在内存分配和回收的问题;堆内存和栈内存的区别可以用如下的比喻来看出:使用堆内存…

mysql 5.6 linux安装配置_linux手动安装配置mysql5.6

1.准备工作①官网下载:https://dev.mysql.com/downloads/mysql/5.6.html#downloads下载之后上传到服务器。②创建linux组用户groupadd mysqluseradd -g mysql mysql2.安装①解压,比如放到了/usr/local/,进入到该目录下,进行用z解压gz包&#…

KVM安装Windows Server 2008 R2使用virtio硬盘

在上一篇文章中,我们介绍了使用IDE硬盘来安装Windows Server 2008 R2,这篇文章我们来介绍使用virtio硬盘来安装Windows Server 2008 R2。 说明:KVM默认使用的硬盘格式为virtio。 使用virtio接口的硬盘,我们必须加载virtio硬盘驱动。如果不加载…

Sublime Text 2 入门及技巧

看了 Nettuts 对 Sublime Text 2 的介绍,立刻就兴奋了,诚如作者 Jeffrey Way 所说:“《永远的毁灭公爵》都发布了,TextMate 2 还没发”,你还能指望它么?TextMate 开发者的消极态度已经无法让人忍受了。而作…

YII 配置文件

用YIIFramework的库开发 Java代码 .... Yii::createWebApplication($config); //没有run Yii::import(class1,true),在将class1类文件路径存储时,同时include该文件 注意:你也可以将配置文件分为多个文件&#xff0…

mysql装完后navicat无法连接_重装mysql后导致Navicat连接失败

今天重装了mysql数据库,然后再使用navicat去连接数据库的时候,一直报错 1251 Client does not support authentication protocol requested by server解决方法:1、cmd登录mysql2、修改Navicat中连接数据库的密码3、刷新mysql的系统权限表flus…

怎样创建XML文档

在程序中,我们怎样创建一个XML文档。下面演示中,Insus.NET在程序创建一个和http://www.cnblogs.com/insus/p/3274220.html 一模一样的XML文档。可以在HTML markup放一个铵钮: 去.aspx.cs写按钮事件: 上图代码示例中,右…

Windows Server 2008设置远程桌面连接的最大数量

远程桌面连接的默认数量是2,当有多个用户需要同时远程桌面连接时很不方便,可以设置远程桌面连接的最大数量。 1. 运行gpedit.msc; 2. 选择计算机配置-->管理模板-->Windows组件-->远程桌面服务-->远程桌面会话主机-->连接&…

错误: 元素值必须为常量表达式_C语言编程常见错误集锦 【下】

1、输入数据时,规定精度输入数据时不能规定精度。2、switch语句中漏写break语句由于漏写了break语句,case只起标识的作用,而不起判断的作用。当grade的值为A时,程序会从上到下执行完,五个printf都输出。正确的写法应为…

Hadoop概述

为什么80%的码农都做不了架构师?>>> 一:Hadoop的相关概念 1、Hadoop是一个基于java语言的MapReduce框架。 2、Hadoop的改进: a、Hadoop Streaming--任何命令行脚本都可以通过Streaming调用MapReduce框架。 b、Hadoop Hive&#xf…

WHU 1470 Join in tasks 水题

http://acm.whu.edu.cn/land/problem/detail?problem_id1470 大概是给你一个队列,每次移动队头的数到队尾并减1,如果本身这个数为1就删去. 然后ans 这个数 * (队列长度-1),求最小的ans 只要最小的元素最先删除就能保证结果最小 解法: 先对原数列排序 然后模拟原操作 ...但是…

TF-IDF理解及其Java实现

TF-IDF 前言 前段时间,又具体看了自己以前整理的TF-IDF,这里把它发布在博客上,知识就是需要不断的重复的,否则就感觉生疏了。 TF-IDF理解 TF-IDF(term frequency–inverse document frequency)是一种用于资…

PostgreSQL 9.2迁移到9.3

Netkiller PostgreSQL 手札 Mr. Neo Chan, 陈景峰(BG7NYT) 中国广东省深圳市龙华新区民治街道溪山美地51813186 1311366889086 755 29812080<netkillermsn.com> 文档始创于2012-11-16 版权 © 2010, 2011, 2012, 2013 Netkiller(Neo Chan). All rights reserved. 版…

C#原型模式之深复制实现

SYSTEM空间有ICONEALBE接口。。。因为其太常用。 1 /*2 * Created by SharpDevelop.3 * User: home4 * Date: 2013/4/215 * Time: 22:206 * 7 * To change this template use Tools | Options | Coding | Edit Standard Headers.8 */9 using System;10 11 namespace Res…