前言

现在许多的计算机系统和多核芯片都在硬件层面支持共享内存(shared memory). 在共享内存系统中,每一个处理器核都可以对一个单独的内存地址空间进行读写。对共享内存系统来说,Memory Consistency Model 就是给存储系统定义了一套架构层面的可视行为。Consistency 就是提供了一套关于memory 的Load 和 Store (亦可称为内存的读写)的行为规范。作为支持memory consistency model的一部分,许多系统也提供了cache coherence 的协议来确保多cache结构中数据的及时更新。本书的目的就是给读者提供关于consistency 和 coherence基本概念的理解。这些基本理解包括共享内存中必须要解决的问题以及多种解决办法。我们提供了从抽象到具体的例子,这些例子都是来自实际项目中。


关键词 :计算机体系结构、 memory consistency、 cache coherence、 shared memory、 multicore process

Memory Consistency Motivation and Sequential Consistency

  • 前言
  • 3.1 共享内存行为所遇到的问题
  • 3.2 什么是Memory Consistency Model?
  • 3.3 Consistency VS Coherence
  • 3.4 Sequential Consistency的基本思想
    • 3.5 Sequential Consistency的形式
    • 3.6 简单的Sequential Consistency实现
    • 3.7 使用Cache coherence实现简单的SC
    • 3.8 使用Cache coherence实现简单SC的优化
    • 3.9 SC的Atomic 操作
    • 3.10 总结:MIPS R10000
    • 3.11 关于SC的进一步阅读
    • 3.12 参考文献
  • 3.3 Consistency VS Coherence

3.1 共享内存行为所遇到的问题

已读未翻

3.2 什么是Memory Consistency Model?

上一节中的例子给出了共享内存的行为需要关注的两个点是:

  • 程序员期待共享内存拥有什么样的行为?
  • 系统实现人员可以进行什么样的优化?

Memory Consistency Model 所实现的就是一套行为规范(spec).该spec规定了针对shared memory, 多线程程序允许执行的一些操作。对多线程程序来说,用具体的输入数据,它指定了动态Load所返回的值和memory最后的数据状态。不像单线程的程序,多线程的程序可以允许有多个正确的行为,就如我们接下来要讲的Sequential Consistency一样(在3.4节及以后的节中讲)

通常,Memory Consistency Model (MC)给出了一套规则,来将程序的执行划分为“服从 MC(MC executions)”和“不服从MC(non-MC executions)”两个部分。这种程序执行上的分区又反过来对实现进行了分区MC实现系统 只允许进行执行MC executions,而非MC实现系统 偶尔允许non-MC executions
最后,我们假定程序都是在ISA层面进执行的,且进行Memory Access的地址都是memory 内的物理地址(i.e.,我们暂时不考虑虚拟存储和地址翻译的影响)

3.3 Consistency VS Coherence

第2章中定义了2个词,此处再赘述一下,即*Single-Writer-Multiple-ReaderData-Value*。其中

Single-Writer-Multiple-Reader是指在任意时间,针对memory中给定的一个物理地址,只允许有两种操作:

  • 只允许有一个core对此地址进行写操作
  • 或者允许有0~多个core对此地址进行读操作

Data-Value是指memory中给定的address下data的最新值总能被更新到cache中,换句话说就是cache中的data值永远都是跟memory中的值同步更新的,不存在cache和memory不同步的情况。

似乎cache coherence已经定义了shared memory 的行为。但其实并不是如此,主要有以下三个原因:

  • cache coherence的目标是使得多核系统中的cache如单核系统中的cache一样不可见。但是,一旦cache不可见了,那还剩下什么行为呢?
  • Cache coherence一次只解决一个cache block的问题,而对多个cache 交互访问的操作不起作用。但真实的程序去访问的变量基本都是会跨多个cache block的。
  • 退一步讲,即使没有coherence,甚至没有cache 也是可以实现一个memory系统的

尽管coherence不是必须的,但很多shared memory系统却确实是通过coherent cache 来实现的memory consistency model.尽管在极端的情况下(几乎不存在),consistency的实现可以不需要coherence的实现,但在这里展示的以及接下来两章内容中,我们将会把coherence当作一个子程序来调用。例如,我们将直接调用Single-Writer-Multiple-Reader(SWMR)而不去关心它具体是是如何实现的。
总结以下就是

  • Cache coherence 不等同于 memory consistency
  • 实现memory consistency时可以将cache coherence当作一个好用的“黑盒子”来调用

3.4 Sequential Consistency的基本思想

简单来说,Memory Consistency直观上就是Sequential Consistency(顺序一致性,SC). Sequential Consistency 首次是由Lamport提出的。

  • 对一个单核处理器Single-core,他的执行结果的顺序和由程序所指定的顺序一致,则称该单核处理器为Sequential的
    (原文:“the result of an execution is the same as if the operations had been executed in the order specified by the program.”)

  • 对一个多核处理器(multi-core), 如果该处理器的所有操作都是按某种顺序执行的,并且每个单独的处理器(Single-core)的操作都是按其程序指定的顺序出现的,那么任何执行的结果都是一样的,这样的行为称为多核系统的顺序一致性(multi-core sequential consistency).这操作的总顺序称为memory order. 在Sequential Consistency系统中,memory order 尊重 每个core的program order。(何谓尊重,看后续解释)

下图3.1描述了表格3.1中例程的执行过程。


中间竖直线下较粗的箭头代表memory order (<m),我们用标识符(<m)来表示memory order,所以

op1 <m op2
表示operation1先执行,operation2后执行
(即operation1 先于 operation2);

两边两条向下的箭头代表每个core各自的program order (<p).我们用标识符(<p)来表示program order,同样的,

op1 <p op2
表示operation1先于operation2执行

在Sequential Consistency下,memory order 尊重每个core的program order意味着

    op1 <p op2          -------导出------->        op1 <m op2

在图3.1中(/* … */)注释中给出的是load或者store的具体真实值。这一系列执行以 r2=NEW 为结束标志。更通俗的说,在表3.1中,所有的程序一直执行到r2=NEW为止。其中唯一不确定的就是L1 load flag=0的次数,因为在L1 load flag = SET之前,L1就得不停的load flag = 0.(当然了,L1 load flag = 0的次数并不重要)

在Figure 3.2中展示了Table 3.3中4条指令执行的细节。


Figure3.2中的(a,b,c)分别代表

a   -------------->   (r1, r2) = (0, NEW),
b   -------------->   (r1, r2) = (NEW, 0),
c   -------------->   (r1, r2) = (NEW, NEW).

其中c只描述了4种SC执行可能性中的一种

{S1, S2, L1, L2}  -------------->   (r1, r2) = (NEW, NEW)

其他三种情况为

{S1, S2, L2, L1}  -------------->   (r1, r2) = (NEW, NEW)
{S2, S1, L1, L2}  -------------->   (r1, r2) = (NEW, NEW)
{S2, S1, L2, L1}  -------------->   (r1, r2) = (NEW, NEW)

因此Figure3.2的a~c就展示了6种合法的SC操作

但在Figure3.2的d图中,展示了对应于输出(r1, r2) = (0, 0)的非SC操作。对这个输出,无法创建可以尊重program order 的memory order.
program order 如下:

S1 <p L1
S2 <p L2

但memory order如下

L1 <m S2       (so r1 is 0)
L2 <m S1       (so r2 is 0)

遵守所有这些约束会引起循环,这与总顺序不一致。Figure3.2d中的弧线说明了问题。
我们刚刚看到了6次SC操作和1次非SC操作。这可以帮助我们理解SC的实现:一个Sequential Consistency的实现必须允许前6个合法SC操作中的一个,但不能允许第7个的非SC操作。
在此我们也看到了Consistency和Coherence的一个关键区别,那就是Coherence 一般是适用于每个block的,而Consistency则是跨整个block定义的。(在此预告一下在第7章,我们会介绍snooping system 来确保跨整个block的coherence request的总顺序。为了支持Sequential Consistency Model模型(如SC),snooping protocol似乎需要这种过度操作。)

3.5 Sequential Consistency的形式

3.6 简单的Sequential Consistency实现

3.7 使用Cache coherence实现简单的SC

3.8 使用Cache coherence实现简单SC的优化

3.9 SC的Atomic 操作

3.10 总结:MIPS R10000

3.11 关于SC的进一步阅读

3.12 参考文献


3.3 Consistency VS Coherence

A Primer on Memory Consistency and Cache Coherence相关推荐

  1. 为什么程序员需要关心顺序一致性(Sequential Consistency)而不是Cache一致性(Cache Coherence)

    本文所讨论的计算机模型是Shared Memory Multiprocessor,即我们现在常见的共享内存的多核CPU.本文适合的对象是想用C++或者Java进行多线程编程的程序员.本文主要包括对Se ...

  2. 介绍内存一致性(Memory Consistency)和缓存一致性(Cache Coherence)

    为了追求PPA(高性能.低功耗和低成本),许多现代计算机系统和多核(处理器)芯片都支持共享硬件内存.在存在共享内存的存储器系统中,每个处理器都可以读写某个共享地址空间. 在支持共享内存之前最重要的是保 ...

  3. Cache Coherence for GPU Architectures

    文章目录 摘要 1 Introduction 2 Related Work 3 背景 3.1 Baseline GPU Architecture 摘要 scalable coherence 已被 st ...

  4. Memory Notification: Library Cache Object loaded into SGA问题

    问题:alert_SID.log出现 Memory Notification: Library Cache Object loaded into SGA Heap size 2289K exceeds ...

  5. Memory Notification: Library Cache Object loaded into SGA / ORA-600 [KGL-heap-size-exceeded]

    这些是不会导致进程失败的警告消息. 它们是以10gR2数据库版本开始引入的事件消息传递机制和内存管理器的结果. 由于共享池中的大对象可能会导致问题,因此已实施此警告阈值. 分配比此警告阈值更多的空间的 ...

  6. cache coherence

    1.CPU没有管脚直接连到内存.相反,CPU和一级缓存(L1 Cache)通讯,而一级缓存才能和内存通讯.大约二十年前,一级缓存可以直接和内存传输数据.如今,更多级别的缓存加入到设计中,一级缓存已经不 ...

  7. [mmu/cache]-ARMV8 MMU内存管理中的Memory attributes和Cache policies

    快速链接: .

  8. Cache(三):cache的常见名词与Cache一致性问题简介

    这里一起学习一点关于学习cache中常见的术语,并再次复习一下. 学习的前辈的blog链接:https://blog.csdn.net/vivo01/article/details/127243849 ...

  9. OS实战笔记(5)-- Cache和内存

    最近工作忙,业余时间也基本投入到了Unity中,OS实战笔记看着要烂尾了,提醒自己要抽时间把这个专题补上,今天先更一篇关于Cache和内存的. 本篇笔记主要复习几个点: 1. 程序局部性原理 2. C ...

最新文章

  1. Android中实现整个视图切换的左右滑动效果
  2. 教AI区分因果关系和相关性,将改变下一代 AI 的研发
  3. idea集成scala插件
  4. 怎样用计算机添加文章标题,计算机论文题目怎么定-易指做帮写网
  5. 阿里技术专家告诉你,如何画出优秀的架构图?
  6. /etc/security/limits.conf的相关说明
  7. 分别用雅可比(Jacobi)迭代法和高斯—塞德尔(Gauss—Seidel)迭代法求解线性方程组(转载)
  8. 微软开源 Scalar,提升操作巨型 Git 仓库的速度
  9. python3库安装_Python3 Requirements库安装过程
  10. 机器学习、统计分析、数据挖掘、神经网络、人工智能、模式识别,
  11. 近年来最流行网络词汇及论坛用语
  12. 关于半导体器件材料的这些基础知识你都知道?
  13. WT2003H语音芯片在红绿灯上的运用,一款可远程更新的语音IC方案
  14. ps显示暂存盘已满如何解决?解决photoshop暂存盘已满的五种方法!
  15. 乐理入门: 二、时值、节奏、节拍
  16. Ubuntu 16.04+1080Ti机器学习基本环境配置【转】
  17. 【opencv】支付宝AR实景红包领取方法
  18. java 三个字母组合_每天AC系列(三):电话号码的字母组合
  19. 【基础强训】day4
  20. 【Linux系统】Linux的系统目录结构

热门文章

  1. Elecard Stream Analyzer码流分析工具
  2. 虚拟人火了,你准备好了吗?
  3. java文件下载功能代码(单文件下载、多文件批量打包下载)——普遍适用
  4. python手记(12)
  5. 在同一主机上建立用户管理的复制数据库 笔记
  6. 大型网站架构推荐书籍
  7. 01、顺序表SeqList
  8. Consider defining a bean of type ‘java.util.List‘ in your configuration.
  9. 软件工程个人项目作业----论文查重
  10. python3调用js的库之execjs