`
jimmee
  • 浏览: 564075 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

1. CPU缓存刷新的误解[转载]

阅读更多

原文地址  作者:Mechanical Sympathy  译者:潘曦  校对:Simon-SZ ,方腾飞

即使是资深的技术人员,我经常听到他们谈论某些操作是如何导致一个CPU缓存的刷新。看来这是关于CPU缓存如何工作和缓存子系统如何与执行核心交互的一个常见误区。本文将致力于解释CPU缓存的功能以及执行程序指令的CPU核心如何与缓存交互。我将以最新的Intel x86 CPU为例进行说明,其他CPU也使用相似技术以达到相同目的。

绝大部分常见的现代系统都被设计成在多处理器上共享内存。共享内存的系统都有一个单独的内存资源,它会被两个或者更多的独立CPU核心同时访问。核心到主存的延迟变化范围很大,大约在10-100纳秒。在100ns内,一个3GH的CPU可以处理多达1200条指令。每一个Sandy Bridge的CPU核心,在每个CPU时钟内可以并行处理4条指令。CPU使用缓存子系统避免了处理核心直接访问主存的延迟,这样能使CPU更高效的处理指令。一些缓存很小、非常快速并且集成在每个核心之内;而另一些则慢一些、更大、在各个核心间共享。这些缓存与寄存器和主内存一起构成了非持久性的内存体系。

当你在设计一个重要算法时要记住,缓存不命中所导致的延迟,可能会使你失去执行500条指令时间!这还仅是在单插槽(single-socket)系统上,如果是多插槽(multi-socket)系统,由于内存访问需要跨槽交互,可能会导致双倍的性能损失。

内存体系



 

图1.对于2012 Sandy Bridge核心来说,内存模型可以大致按照如下进行分解:

1.寄存器:在每个核心上,有160个用于整数和144个用于浮点的寄存器单元。访问这些寄存器只需要一个时钟周期,这构成了对执行核心来说最快的内存。编译器会将本地变量和函数参数分配到这些寄存器上。当使用超线程技术( hyperthreading )时,这些寄存器可以在超线程协同下共享。

2.内存排序缓冲(Memory Ordering Buffers (MOB) ):MOB由一个64长度的load缓冲和36长度的store缓冲组成。这些缓冲用于记录等待缓存子系统时正在执行的操作。store缓冲是一个完全的相关性队列,可以用于搜索已经存在store操作,这些store操作在等待L1缓存的时候被队列化。在数据与缓存子系统传输时, 缓冲可以让处理器异步运转。当处理器异步读或者异步写的时候,结果可以乱序返回。为了使之与已发布的内存模型( memory model )一致,MOB用于消除load和store的顺序。

3.Level 1 缓存:L1是一个本地核心内的缓存,被分成独立的32K数据缓存和32K指令缓存。访问需要3个时钟周期,并且当指令被核心流水化时, 如果数据已经在L1缓存中的话,访问时间可以忽略。

4.L2缓存:L2缓存是一个本地核心内的缓存,被设计为L1缓存与共享的L3缓存之间的缓冲。L2缓存大小为256K,主要作用是作为L1和L3之间的高效内存访问队列。L2缓存同时包含数据和指令。L2缓存的延迟为12个时钟周期。

5.L3缓存: 在同插槽的所有核心都共享L3缓存。L3缓存被分为数个2MB的段,每一个段都连接到槽上的环形网络。每一个核心也连接到这个环形网络上。地址通过hash的方式映射到段上以达到更大的吞吐量。根据缓存大小,延迟有可能高达38个时钟周期。在环上每增加一个节点将消耗一个额外的时钟周期。缓存大小根据段的数量最大可以达到20MB。L3缓存包括了在同一个槽上的所有L1和L2缓存中的数据。这种设计消耗了空间,但是使L3缓存可以拦截对L1和L2缓存的请求,减轻了各核心私有的L1和L2缓存的负担。

6.主内存:在缓存完全没命中的情况下,DRAM通道到每个槽的延迟平均为65ns。具体延迟多少取决于很多因素,比如,下一次对同一缓存 行中数据的访问将极大降低延迟,而当队列化效果和内存刷新周期冲突时将显著增加延迟。每个槽使用4个内存通道聚合起来增加吞吐量,并通过在独立内存通道上流水线化(pipelining )将隐藏这种延迟。

7. NUMA:在一个多插槽的服务器上,会使用非一致性内存访问( non-uniform memory access )。所谓的非一致性是指,需要访问的内存可能在另一个插槽上,并且通过 QPI 总线访问需要额外花费40ns。 Sandy Bridge对于以往的兼容系统来说,在2插槽系统上是一个巨大的进步。在 Sandy Bridge上,QPI总线的能力从6.4GT/s提升到8.0GT/s,并且可以使用两条线路,消除了以前系统的瓶颈。对于 Nehalem and Westmere 来说,QPI只能使用内存控制器为一个单独插槽分配的带宽中的40%,这使访问远程内存成为一个瓶颈。另外,现在QPI链接可以使用预读取请求,而前一代系统不行。

关联度(Associativity Levels)

缓存是一个依赖于hash表的高效硬件。使用hash函数常常只是将地址中低位bit 进行映射 ,以实现缓存索引。hash表需要有解决对于同一位置冲突的机制。 关联度就是hash表中槽(slot)的数量,也被称为组(ways)和集合(sets),可以用来存储一个内存地址的hash版本。关联度的多少需要在存储数据的容量,耗电量和查询时间之间寻找平衡。(校对注:关联度越高,槽的数量越多,hash冲突越小,查询速度越快)

对于Sandy Bridge,L1和L2是8路组相连 ,L3是12路组相连 。(For Sandy Bridge the L1D and L2 are 8-way associative, the L3 is 12-way associative.)

缓存一致性

由于一些缓存在内核本地,我们需要一些方法保证一致性,使所有核心的内存视图一致。对于主流系统来说,内存子系统需要考虑“真实的来源(source of truth)”。如果数据只从缓存中来,那么它永远不会过期;当数据同时在缓存和主内存中存在时,缓存中存的是主拷贝(master copy)。这种内存管理被称为写-回(write-back),在此方式下,当新的缓存行占用旧行,导致旧行被驱逐时,缓存数据只会被写回主内存中。x86架构的每个缓存块的大小为64 bytes,称为缓存行( cache-line)。其它种类的处理器的缓存行大小可能不同。更大的缓存行容量降低延迟,但是需要更大的带宽校对注:数据总线带宽)。

为了保证缓存的一致性,缓存控制器跟踪每一个缓存行的状态,这些状态的数量是有限的。Intel使用MESIF协议,AMD使用 MOESI。在MESIF协议下,缓存行处于以下5个状态中的1个。

被修改(Modified):表明缓存行已经过期,在接下来的场景中要写回主内存。当写回主内存后状态将转变为排它( Exclusive )。

独享(Exclusive)表明缓存行被当前核心单独持有,并且与主内存中一致。当被写入时,状态将转变为修改(Modified)。要进入这个状态,需要发送一个 Request-For-Ownership (RFO)消息,这包含一个读操作再加上广播通知其他拷贝失效。

共享(Shared):表明缓存行是一个与主内存一致的拷贝。

失效(Invalid):表明是一个无效的缓存行。

向前( Forward ):一个特殊的共享状态。用来表示在NUMA体系中响应其他缓存的特定缓存。

为了从一个状态转变为另一个状态,在缓存之间,需要发送一系列的消息使状态改变生效。对于上一代(或之前)的 Nehalem核心的Intel CPU和 Opteron核心的AMD CPU,插槽之间确保缓存一致性的流量需要通过内存总线共享,这极大地限制了可扩展性。如今,内存控制器的流量使用一个单独的总线来传输。例如,Intel的QPI和AMD的HyperTransport就用于插槽间的缓存一致性通讯。

缓存控制器作为L3缓存段的一个模块连接到插槽上的环行总线网络。每一个核心,L3缓存段,QPI控制器,内存控制器和集成图形子系统都连接到这个环行总线上。环由四个独立的通道构成,用于:在每个时钟内完成请求、嗅探、确认和传输32-bytes的数据(The ring is made up of 4 independent lanes for: request,snoopacknowledge, and 32-bytesdata per cycle)。L3缓存包含所有L1和L2缓存中的缓存行,这有助于帮助核心在嗅探变化时快速确认改变的行。用于L3缓存段的缓存控制器记录了哪个核心可能改变自己的缓存行。

如果一个核心想要读取一些数据,并且这些数据在缓存中并不处于共享、独占或者被修改状态;那么它就需要在环形总线上做一个读操作。它要么从主内存中读取(缓存没命中),要么从L3缓存读取(如果没过期或者被其他核心嗅探到改变)。在任何情况下,一致性协议都能保证,读操作永远不会从缓存子系统返回一份过期拷贝。

并发编程

如果我们的缓存总是保证一致性,那么为什么我们在写并发程序时要担心可见性?这是因为核心为了得到更好的性能,对于其它线程来说,可能会出现数据修改的乱序。这么做主要有两个理由。

首先,我们的编译器在生成程序代码时,为了性能,可能让变量在寄存器中存在很长的时间,例如,变量在一个循环中重复使用。如果我们需要这些变量在核心之间可见,那么变量就不能在寄存器分配。在C语言中,可以添加“volatile”关键字达到这个目标。要记住,c/c++中volatile并不能保证让编译器不重排我们的指令。因此,需要使用内存屏障。

排序的第二个主要问题是,一个线程写了一个变量,然后很快读取,有可能从读缓冲中获得比缓存子系统中最新值要旧的值。这对于遵循单写入者原则(Single Writer Principle)的程序来说没有任何问题,但是对于Dekker 和Peterson锁算法就是个很大问题。为了克服这一点,并且确保最新值可见,线程不能从本地读缓冲中读取值。可以使用屏障指令,防止下一个读操作在另一线程的写操作之前发生。在Java中对一个volatile变量进行写操作,除了永远不会在寄存器中分配之外,还会伴随一个完全的屏障指令。在x86架构上,屏障指令在读缓冲排空之前,会显著影响放置屏障的线程的运行。在其它处理器上,屏障有更有效率的实现,例如 Azul Vega在读缓冲上放置一个标志用于边界搜索。

当遵循单写入者原则时,要确保Java线程之间的内存次序,避免store屏障,那么就使用j.u.c.Atomic(Int|Long|Reference).lazySet()方法,而非放置一个volatile变量。

误区

回到作为并发算法中的一部分的“刷新缓存”误区上,我想,可以说我们永远不会在用户空间的程序上“刷新”CPU缓存。我相信这个误区的来源是由于在某些并发算法需要刷新、标记或者清空store缓冲以使下一个读操作可以看到最新值。为了达到这点,我们需要内存屏障而非刷新缓存。

这个误解的另一个可能来源是,L1缓存,或者 TLB,在上下文切换的时候可能需要根据地址索引策略进行刷新。ARM,在ARMv6之前,没有在TLB条目上使用地址空间标签,因此在上下文切换的时候需要刷新整个L1缓存。许多处理器因为类似的理由需要L1指令缓存刷新,在许多场景下,仅仅是因为指令缓存没有必要保持一致。上下文切换消耗很大,除了污染L2缓存之外,上下文切换还会导致TLB和/或者L1缓存刷新。Intel x86处理器在上下文切换时仅仅需要TLB刷新。

(校对注:TLB是Translation lookaside buffer,即页表缓冲;里面存放的是一些页表文件,又称为快表技术,由于“页表”存储在主存储器中,查询页表所付出的代价很大,由此产生了TLB。)

  • 大小: 67.1 KB
分享到:
评论

相关推荐

    计算机硬件基础考试题.pdf

    1. **IBM S/360**:这是IBM在1960年代推出的一种采用集成电路的第三代计算机,标志着计算机从电子管到晶体管的过渡。 2. **摩尔定律**:由英特尔创始人戈登·摩尔提出,预测在相同成本下,集成电路芯片上的晶体管...

    HTTPS的七个误解

    1. **生成CSR文件**:在服务器上生成CSR文件(SSL证书请求文件)。 2. **购买SSL证书**:使用CSR文件购买SSL证书。 3. **安装SSL证书**:安装证书。 这些步骤确保了传输过程的安全性,防止证书被截获或非法获取。...

    计算机组成原理实验报告二

    静态存储器具有高速读写、数据保持等特点,常用于CPU缓存或其他需要快速访问数据的应用。实验要求学生不仅理解其工作原理,还要学会如何实际操作,这包括正确地连接电路,避免因错误操作导致设备损坏。 实验方案...

    硬件笔试题

    归一化的过程通常是将各种频率的信号按其相对于采样频率的比例表示,这样所有的频率值都被限制在[0,1]之间,便于分析和避免数据溢出问题。 ### 总线带宽计算 总线带宽的计算公式为:\[总线带宽 = 数据宽度 \times ...

    富文本编辑器开发:Vue3+TipTap核心功能实现.pdf

    文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 Vue 3是一款备受瞩目的JavaScript框架,它采用了基于Proxy的响应式系统,显著提升了性能和调试能力。其Composition API带来了更高效的逻辑组织方式,使代码复用变得轻而易举。Tree-shaking支持让打包后的文件体积更小,进一步优化了应用性能。Vue 3还与TypeScript深度集成,提供了更完善的类型推导,让开发过程更加顺畅。无论是构建大型应用还是小型项目,Vue 3都能凭借其出色的性能和灵活的架构,帮助开发者高效完成任务,是现代Web开发的理想选择。

    分类:多类别分类.pdf

    分类、阈值、混淆矩阵、准确率、召回率、精确率等教程和代码

    基于OAuth2+SpringSecurity+Jwt实现身份认证和权限管理后端服务代码合集

    基于OAuth2+SpringSecurity+Jwt实现身份认证和权限管理后端服务代码合集

    用visio制作基本流程图.pptx

    Visio学习相关文档

    手绘风格小动物素材教学课件模板.pptx

    手绘风格小动物素材教学课件模板

    【计算机视觉】OpenCV高频面试题解析:涵盖图像处理、特征提取与目标检测技术要点

    内容概要:本文档《opencv高频面试题.docx》涵盖了OpenCV的基础概念、图像处理操作、特征提取与匹配、目标检测与机器学习、实际编程题、性能优化以及进阶问题。首先介绍了OpenCV作为开源计算机视觉库,支持图像/视频处理、目标检测、机器学习等领域,应用于安防、自动驾驶、医学影像、AR/VR等方面。接着详细讲述了图像的存储格式(如Mat类)、通道的概念及其转换方法。在图像处理部分,讲解了图像灰度化、二值化、边缘检测等技术。特征提取方面,对比了Harris和Shi-Tomasi角点检测算法,以及SIFT、SURF、ORB的特征提取原理和优缺点。目标检测部分介绍了Haar级联检测原理,并阐述了如何调用深度学习模型进行目标检测。文档还提供了几个实际编程题示例,如读取并显示图像、图像旋转、绘制矩形框并保存等。最后,探讨了性能优化的方法,如使用cv2.UMat(GPU加速)、减少循环等,以及相机标定、光流等进阶问题。 适合人群:对计算机视觉有一定兴趣,具备一定编程基础的学习者或从业者。 使用场景及目标:①帮助学习者掌握OpenCV的基本概念和技术;②为面试准备提供参考;③为实际项目开发提供技术指导。 阅读建议:由于内容涵盖广泛,建议读者根据自身需求有选择地深入学习相关章节,并结合实际编程练习加深理解。

    PowerPDF for Delphi FS.7z

    PowerPDF for Delphi 完整源码版 PowerPdf is a VCL component to create PDF docment visually. Like Forms, you can design PDF document easily on Delphi IDE.

    机器翻译应用:Vue3+Transformer模型整合.pdf

    文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 Vue 3是一款备受瞩目的JavaScript框架,它采用了基于Proxy的响应式系统,显著提升了性能和调试能力。其Composition API带来了更高效的逻辑组织方式,使代码复用变得轻而易举。Tree-shaking支持让打包后的文件体积更小,进一步优化了应用性能。Vue 3还与TypeScript深度集成,提供了更完善的类型推导,让开发过程更加顺畅。无论是构建大型应用还是小型项目,Vue 3都能凭借其出色的性能和灵活的架构,帮助开发者高效完成任务,是现代Web开发的理想选择。

    情感分析应用:Vue3+自然语言处理实战.pdf

    文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 Vue 3是一款备受瞩目的JavaScript框架,它采用了基于Proxy的响应式系统,显著提升了性能和调试能力。其Composition API带来了更高效的逻辑组织方式,使代码复用变得轻而易举。Tree-shaking支持让打包后的文件体积更小,进一步优化了应用性能。Vue 3还与TypeScript深度集成,提供了更完善的类型推导,让开发过程更加顺畅。无论是构建大型应用还是小型项目,Vue 3都能凭借其出色的性能和灵活的架构,帮助开发者高效完成任务,是现代Web开发的理想选择。

    基于S7-1200 PLC的自动锁螺丝机:IO表、图纸、组态仿真与报告的全面解析

    内容概要:本文深入介绍了基于S7-1200 PLC的自动锁螺丝机系统,涵盖多个关键技术点。首先,详细解释了IO表的作用及其在系统中的重要性,包括电机驱动输出信号和螺丝位置检测输入信号等。其次,展示了设备图纸的设计细节,为生产和维护提供指导。再者,强调了组态仿真的重要性,通过仿真软件提前测试系统性能,优化参数设置并降低实际运行风险。最后,简要展示了部分控制程序代码,如梯形图代码片段,用于控制电机的正反转。这些内容共同构成了一个完整的自动锁螺丝机解决方案。 适合人群:从事工业自动化领域的工程师、技术人员及研究人员。 使用场景及目标:适用于希望深入了解S7-1200 PLC应用的技术人员,旨在提高生产效率、降低成本并优化系统性能。 其他说明:本文不仅提供了理论知识,还结合了实际案例,有助于读者更好地理解和掌握相关技术。

    stm32f407的超声波源码

    stm32f407的超声波源码

    第六届蓝桥杯大赛个人赛校内选拔:Java大学B组考试规则与题型解析

    内容概要:本文档详细介绍了第六届蓝桥杯大赛个人赛(软件类)校内选拔活动JAVA软件开发大学B组的比赛规则与注意事项。文档明确了考试流程,包括选手需要下载并解压题目,在规定3小时内完成作答并通过浏览器提交答案。强调了考试期间可多次提交同一题目答案,但最终以最后一次提交为准。同时,对不同类型的试题(结果填空、代码填空、程序设计)的具体要求进行了阐述,如代码填空题要求填写的代码不超过一条语句,程序设计题则强调程序的通用性和正确性,并且规定了代码的提交格式(如主类名为Main,不使用package语句,只能使用JDK1.6的语法等)。; 适合人群:准备参加蓝桥杯大赛校内选拔的Java编程爱好者,特别是大学生群体。; 使用场景及目标:①帮助参赛者熟悉比赛流程和规则,确保比赛顺利进行;②明确不同类型题目的答题规范,提高答题效率和准确性;③使参赛者了解代码提交的具体要求,避免因格式问题导致成绩无效。; 其他说明:文档强调了考试纪律,如禁止在代码中加入个人信息,以及对程序设计题的通用性和代码格式的要求,确保评分公正公平。

    序列信号发生器实验仿真

    序列信号发生器 在数字信号的传输和数字系统的测试中,有时需要用到一组特定的串行数字信号。通常这种串行数字信号称为序列信号。产生序列信号的电路就称为序列信号发生器。 序列信号发生器可由计数器和数据选择器构成。图 5-1所示电路就是一个由74LS161(4位二进制计数器)和74LS151组成的能产生8位序列信号的序列信号发生器,其序列信号的排序可通过改变数据选择器74LS151的数据输入端D0~D7与1和0的接法不同来获取,如图中所示的连接可产生10010101的序列信号输出。

    数据路关于什么是事务的知识点总结

    数据路关于什么是事务的知识点总结

    36种动物目标检测数据集.zip

    数据集介绍:36种动物目标检测数据集 一、基础信息 数据集名称:36种动物目标检测数据集 图片数量: - 训练集:6,719张图片 - 验证集:1,907张图片 - 测试集:962张图片 分类类别: 涵盖36种陆地及空中动物类别,包括但不限于: - 家畜类:Cattle(牛)、Sheep(羊)、Goat(山羊)、Pig(猪) - 野生哺乳类:Bear(熊)、Fox(狐)、Lynx(猞猁)、Otter(水獭) - 鸟类:Eagle(鹰)、Owl(猫头鹰)、Parrot(鹦鹉)、Swan(天鹅) - 小型动物:Rabbit(兔)、Mouse(鼠)、Hedgehog(刺猬)、Frog(蛙) 标注格式: YOLO格式,包含目标边界框坐标及类别索引,可直接用于主流深度学习框架训练。 二、适用场景 农业与畜牧业监测: 支持开发牲畜数量统计、健康监测系统,提升养殖场自动化管理水平。 生态保护与野生动物研究: 用于自然保护区动物分布监测、濒危物种识别等场景的AI模型训练。 智能安防系统: 集成至CCTV监控系统,检测农场/城市环境中特定动物(如Raccoon浣熊、Snake蛇类)的入侵。 教育科研工具: 为动物行为学、生物多样性研究提供标准化视觉数据资源。 三、数据集优势 跨场景物种覆盖: 同时包含家养动物与野生动物,覆盖空中/地面/洞穴物种,支持模型泛化能力训练。 精细化标注体系: 严格遵循YOLO标注标准,针对中小型动物(如Sparrow麻雀、Spider蜘蛛)提供高密度标注。 多环境适应性: 数据来源包含航拍(Aerial)、地面拍摄等多视角,适应复杂背景下的检测需求。 即用型数据划分: 按7:2:1比例预分割训练集/验证集/测试集,支持开箱即用的模型开发流程。 任务扩展潜力: 除目标检测外,可支持动物行为分析、种群密度估计等衍生任务开发。

    电子元件超低抖动差分输出振荡器FCO-2L-UJ:220MHz频率范围及应用特性说明

    内容概要:本文档详细介绍了FCO-2L-UJ系列超低抖动差分输出振荡器的技术规格和应用领域。该振荡器支持100至220 MHz的频率范围,具有非常低的相位抖动(典型值为50飞秒),适用于高精度时钟同步。文档提供了不同供电电压下的电气参数,包括电流消耗、上升/下降时间、输出电平、相位噪声和老化率等。此外,还特别提到了该振荡器在40Gbit/100Gbit以太网、SONET、光纤通道以及测试仪器中的应用。为了确保最佳性能,建议在电源引脚和地之间放置一个0.1μF的旁路电容。 适合人群:电子工程师、硬件设计师、通信系统开发者及相关技术人员。 使用场景及目标:①需要高精度时钟源的通信设备;②对抖动敏感的应用,如高速数据传输和精密测量仪器;③希望了解超低抖动振荡器具体技术参数和应用场景的研发人员。 其他说明:此振荡器尺寸为2.5×2.0毫米,支持三态使能/禁用功能。温度稳定性方面,在-20至70摄氏度范围内可达±20ppm,而在更宽温区内的表现则取决于具体型号。如有特殊规格需求,请联系销售代表获取更多信息。

Global site tag (gtag.js) - Google Analytics