当前位置:首页 » 文件管理 » cpu缓存一致性

cpu缓存一致性

发布时间: 2023-03-30 20:49:23

Ⅰ 二、多处理器下的数据一致性

缓存一致性是指当处理器去访问缓存在其他处理器中的数据时,不能得到错误的数据。如果数据被修改,那么其他处理器也必须得到修改后的数据。

系基蔽腔统内存一致性是指多个处理器同时去访问系统内存的相同地址时,cpu需要提供通讯机制或内存访问协议来保证数据的一致性,某些场景下会允许其中的一个处理器临时的锁定这个内存地址(或更大一点的内存区域)。

cpu保证读写一个byte,word, doubleword的原子性(P6系列的处理器还会保证从缓存行中读写四个字节的原子性,且不要求内存对齐)

• 任意8bit的访问(不用锁定)
• 被锁定的16bit访问
• 被锁定的32bit访问
• 被锁定的64bit访问

在搏衫多处理器系统下,实现同步机制需要依赖并唤一个强内存有序模型。

其中串行指令包括:INVD, INVEPT, INVLPG, INVVPID, LGDT, LIDT, LLDT, LTR, MOV (to control register, with the exception of MOV CR83), MOV (to debug register), WBINVD, and WRMSR4,CPUID, IRET, and RSM。

Ⅱ cpu和gpu之间的高速缓冲

cpu和gpu之间的高速缓冲一致性内存。主存(DRAM)和CPU寄存器之间存在着高首顷槐速缓存(SRAM)来作为过渡。高者友速缓存通常被封装在CPU中。CPU通过北桥来与主存通信并控制主存。乎者

Ⅲ 缓存一致性协议

锁缓存行有一套协议叫做 缓存一致性协梁咐议 。缓滚渣仔存一致性协议有MSI、MESI、MOSI、Synapse、Firefly以及DragonProtocol等等。

MESI分别代表缓存行数据的4中状态,通过对这四种状态的切换,来达到对大汪缓存数据进行管理的目的

假设有三个CPU-A、B、C,对应三个缓存分别是cache-a、b、c。在主内存中定义了x的引用值0

单核读取

MESI优化和引入的问题:各CPU缓存行的状态是通过消息传递来进行的。如果CPU0要对一个在缓存中共享的变量进行写入,首先需要发送一个失效的消息给到其他缓存了该数据的CPU,并且要等到他们的确认回执。CPU0在这段时间内都会一直处于阻塞状态,会导致各种各样的性能问题和稳定性问题。

为了避免阻塞带来的资源浪费,在CPU中引入了Store Buffer。

CPU在写入共享数据时,直接把数据写入到Store Buffer中,同时发送Invalidate消息,然后继续去处理其他指令。当收到其他所有CPU发送了Invalidate Acknowledge消息时,再将Store Buffer中的数据存储到Cache Line中,最后再从Cache Line同步到主内存。

Ⅳ 缓存一致性

在现代的 CPU(大多数)上,所有的内存访问都需要通过层层的缓存来进行。CPU 的读 / 写(以及取指令)单元正常情况下甚至都不能直接访问内存——这是物理结构决定的;CPU 都没有管脚直接连到内存。相反,CPU 和一级缓存(L1 Cache)通讯,而一级缓存才能和内存通讯。大约二十年前,一级缓存可以直接和内存传输数据。如今,更多级别的缓存加入到设计中,一级缓存已经不能直接和内存通讯了,它和二级缓存通讯——而二级缓存才能和内存通讯。或者还可能有三级缓存。

缓存是分“段”(line)的,一个段对应一块存储空间,大小是 32、64或128字节,每个缓存段知道自己对应什么范围的物理内存地址。

当 CPU 看到一条读内存的指令时,它会把内存地址传递给一级数据缓存。一级数据缓存会检查它是否有这个内存地址对应的缓存段。如果没有,它会把整个缓存段从内存(或者从更高一级的缓存,如果有的话)中加载进来。是的,一次加载整个缓存段,这是基于这样一个假设:内存访问倾向于本地化(localized),如果我们当前需要某个地址的数据,那么很可能我们马上要访问它的邻近地址。一旦缓存段被加载到缓存中,读指令就可以正常进行读取。

如果我们只处理读操作,那么事情会很简单,因为所有级别的缓存都遵守以下规律—— 在任意时刻,任意级别缓存中的缓存段的内容,等同于它对应的内存中的内容。

一旦我们允许写操作,事情就变得复杂一点了。这里有两种基本的写模式:直写(write-through)和回写(write-back)。直写更简单一点:我们透过本级缓存,直接把数据写到下一级缓存(或直接到内存)中,如果对应的段被缓存了,我们同时更新缓存中的内容(甚至直接丢弃),就这么简单。这也遵守前面的定律: 缓存中的段永远和它对应的内存内容匹配。

回写模式就有点复杂了。缓存不会立即把写操作传递到下一级,而是仅修改本级缓存中的数据,并且把对应的缓存段标记为“脏”段。脏段会触发回写,也就是把里面的内容写到对应的内存或下一级缓存中。回写后,脏段又变“干净”了。当一个脏段被丢弃的时候,总是先要进行一次回写。回写所遵循的规律有点不同。 当所有的脏段被回写后,任意级别缓存中的缓存段的内容,等同于它对应的内存中的内容。

换句话说,回写模式的定律中,我们去掉了“在任意时刻”这个修饰语,代之以弱化一点的条件:要么缓存段的内容和内存一致(如果缓存段是干净的话),要么缓存段中的内容最终要回写到内存中(对于脏缓存段来说)。

只要系统只有一个 CPU 核在工作,一切都没问题。如果有多个核,每个核又都有自己的缓存,那么我们就遇到问题了,因为如果一个 CPU 缓存了某块内存,那么在其他 CPU 修改这块内存的时候,我们希望得到通知。系统的内存在各个 CPU 之间无法做到与生俱来的同步,我们需要一个大家都能遵守的方法来达到同步的目的。

缓存一致性协议有多种,但是日常处理的大多数计算机设备使用的都属于“窥探(snooping)”协议。

窥探”背后的基本思想是,所有内存传输都发生在一条共享的总线上,而所有的处理器都能看到这条总线:缓存本身是独立的,但是内存是共享资源,所有的内存访问都要经过仲裁(arbitrate):同一个指令周期中,只有一个缓存可以读写内存。窥探协议的思想是,缓存不仅仅在做内存传输的时候才和总线打交道,而是不停地在窥探总线上发生的数据交换,跟踪其他缓存在做什么。所以当一个缓存代表它所属的处理器去读写内存时,其他处理器都会得到通知,它们以此来使自己的缓存保持同步。只要某个处理器一写内存,其他处理器马上就知道这块内存在它们自己的缓存中对应的段已经失效。

在直写模式下,这是很直接的,因为写操作一旦发生,它的效果马上会被“公布”出去。但是如果混着回写模式,就有问题了。因为有可能在写指令执行过后很久,数据才会被真正回写到物理内存中——在这段时间内,其他处理器的缓存也可能会傻乎乎地去写同一块内存地址,导致冲突。在回写模型中,简单把内存写操作的信息广播给其他处理器是不够的,我们需要做的是,在修改本地缓存之前,就要告知其他处理器。

MESI 是四种缓存段状态的首字母缩写,任何多核系统中的缓存段都处于这四种状态之一。

从CPU读写角度来说:

上图的切换解释:

缓存的一致性消息传递是要时间的,这就使其切换时会产生延迟。当一个缓存被切换状态时其他缓存收到消息完成各自的切换并且发出回应消息这么一长串的时间中CPU都会等待所有缓存响应完成。可能出现的阻塞都会导致各种各样的性能问题和稳定性问题。

比如你需要修改本地缓存中的一条信息,那么你必须将I(无效)状态通知到其他拥有该缓存数据的CPU缓存中,并且等待确认。等待确认的过程会阻塞处理器,这会降低处理器的性能。因为这个等待远远比一个指令的执行时间长的多。

为了避免这种CPU运算能力的浪费,Store Bufferes被引入使用。处理器把它想要写入到主存的值写到缓存,然后继续去处理其他事情。当所有失效确认(Invalidate Acknowledge)都接收到时,数据才会最终被提交。

执行失效也不是一个简单的操作,它需要处理器去处理。另外,存储缓存(Store Buffers)并不是无穷大的,所以处理器有时需要等待失效确认的返回。这两个操作都会使得性能大幅降低。为了应付这种情况,引入了失效队列——对于所有的收到的Invalidate请求,Invalidate Acknowlege消息必须立刻发送,Invalidate并不真正执行,而是被放在一个特殊的队列中,在方便的时候才会去执行,处理器不会发送任何消息给所处理的缓存条目,直到它处理Invalidate。

Ⅳ cpu为啥一致

1、木马与病毒:有很多的蠕虫病毒在电脑内部快速繁殖,就会造成了占用过高上升了。这种问题,先要想到就是杀毒软件了。
正常要在安全模式下来杀毒了,因为这样查杀比较彻底。而且杀毒软件要常更新,这样才能保证杀毒的效果更新病毒。
2、大型游戏或程序:有时候运行率高是一些大型程序导致的,比如占内存高的大型游戏。
正常原因有两种:
第一种是编写的程序不符合导致运行率飚高。这种情况比较不常见,因为正常的游戏都是测试过的。
第二种是电脑的配置跟不上了,没有解决方法,要么这游戏不玩了,要么提升下电脑配置了。
3、磁盘碎片:有时候经会对电脑的软件安装或者卸载,当文件在安装和卸载的时候,会使硬盘中的数据排列非常分散或者断断续续的,让电脑在查找时速度变慢,就造成大量的使用CPU。所以要常把系统的垃圾清理掉,清理之后要对磁盘碎片进行整理。
(5)cpu缓存一致性扩展阅读:
电脑cpu常见故障检修:
故障现象:电脑CPU温度过高
1、CPU的故障经常表现为频繁的死机,比如在使用电脑的时候,经常机子会出现停滞,然后就重新启动或者机子使用一会就会死机没有反应了,这一般都是CPU温度过高或者CPU负荷过大造成的,这时候的大家应该清理内存和磁盘。
2、CPU的故障还会表现为:电脑不断自动重启,特别是开机不久便连续出现重启的现象,这样使使用电脑的时候很不方便,几乎无法使用,这估计是滚闷电脑有病毒直接影响了CPU的正常工作。解决问题的办法是,要及时杀毒,同时注意按时升级系统和驱动。
3、另外CPU在笔记本上是无法升级或者单独更换的,必须和主板一起更换才可以,所以选择电脑的时候要千万选好CPU,以免到时候无法升级而后悔。
4、CPU在使用的过程中,关系到电脑的速度和数据的传输,可是CPU比较容易产生热量,因此要隔一段时间彻底的给电脑清理一次灰族码尘,尤其是笔记本电脑更加的重要一些。
5、大家需要注意的由于大穗弯CPU散热本身比较差,特别是使用笔记本的话,温度会提高的更加快,因此建议大家最好可以给笔记本加一个散热器,这样会更加好的保护笔记本电脑和CPU。

Ⅵ gpu二缓一致

gpu二缓一致,GPU的LLC是全部SM共享的,memory-side caching, 采用write-back policy,不存在一致性的问题,在异构架构中,我们可以在CPU和加速器之间暴露一个全局的共享内存接口,我们假设CPU、GPU等设备共享相同的物理内存(如手机上的SoC这种情况),如下图所示。在这种系统中,共享内存会引发一些新的问题,如什么是内存一致性模型?内存一致性模型如何实现?加速器和处理器的私有缓存如何保持一致?我们接下来首先讨论加速器内的内存一致性和缓存一致性,重点是GPU,然后讨论跨加速器的内存一致性和缓存一致性。

异构SoC系统模型
GPU的内存一致性和缓存一致性
早期GPU的架构余前与编程模型
早期GPU主要为并行图形工作负载设计,特点是数据并行度高,但数据共享、同步和通信程度低。

GPU架构

GPU通常有几十个内核,叫做流式多处理器(Streaming Multiprocessors,SM),每个SM都是高度多线程的,能够运行上千条线程,映射到SM上的线程共享L1缓存和本地scratchpad内存,所有的SM都共享一个L2缓存。GPU通常将线程分组执行,称为warps,一个warp中的所有线程共享PC和堆栈,可以使用掩码来执行独立的线程,表明哪些线程在执行,哪些线程没有在执行,这种并行方式就是我们常听说的SIMT。但是最近,GPU开始允许一个warp中的线程有独立的PC和堆栈,允许线程独立调度,我们接下来也假设线程是可以独立调度的。

由于图形工作负载并不经常共享数据或进行同步,早期GPU选择不在L1缓存实现硬件的缓存一致性。

GPU编程模型

和CPU类似,GPU也有一套虚拟仿配ISA,同时也有一套更高级别的语言框架,如CUDA和OpenCL,框架中的高级语言被编译成虚拟的ISA,并被翻译为本地的二进制文件。GPU虚拟ISA和高级语言框架通过被称为作用域(scope)的线程结构,向程序员暴露GPU架构的层次结构。和CPU相比,GPU线程被分组为叫做Cooperative Thread Arrays(CTA)的集群。CTA作用域指来自同一个CTA的线程集合,保证映射到相同的SM,并共享同一个L1huancun。GPU作用域指的是来自同一个GPU的线程集合,可以来自相同或不同的CTA,并共享L2缓存。最后,系统作用域指整个系统所有线程的集合,共享LLC缓存或统一的共享内存。

这种方式可以在没有硬件缓存一致性的情况下,用软件的方式实现数据同步和通信。

GPU内存一致性

GPU支持宽松一致性模型,通过FENCE指令进行同步,但是由于没有硬件缓存一致性,GPU的FENCE只针对属于同一CTA的其他线程。GPU的store指令也不保证原子性。

因此,早期GPU明确禁止在CTA组之间进行数据同步,但实践中可以通过绕过L1,在L2上进行同步。这种方案也有一些问题,绕过L1会导致性能下降,且程序员需要仔细地编写程序。

测验问题8:GPU不支持硬件缓存一致性,因此无法实现内存一致性模型。
答:错误。早期的GPU不支持硬件缓存一致性,但是支持作用域内的宽松内存一致性模型。
GPGPU的内存一致性和缓存一致性
GPGPU最好满足以下特点:

严格而直观的内存一致性模型,允许在所有线程之间进行同步
一个能够实现内存一致性模型的缓存一致性协议,允许高效的数据共享和同步,且保持常规GPU架构的简单性,因为GPU的主要任务仍然是图形工作负载
我们可以使用类似多核CPU的方法来实现缓存一致性,使用一种与内存模型无关的协议。然而这种方法并不适用于GPU,主要有两个原因。首先,类似于CPU的缓存一致性协议在GPU环境下会产生很高的通信开销,因为L1缓存的总容量通常与L2相当,甚至更大,会产生很大的面积开销,设计也非常复杂;其次,由于GPU保持着数千个活跃的硬件线程,因此需要跟踪相应数量的一致性事务,需要大量的硬件开销。

具体的技术细节可以参考原书(埋坑,GPU的部分确实现在看来有些难理解,等之后学习了GPU的架构之后再回来填坑)。

其他异构系统
我们开始进一步讨论如何在多个设备的系统中暴露一个全局的共享内存接口,难点在于每个设备都可能通过不同的一致性协议竖大清来实现不同的内存模型,当多个内存模型不同的设备被集成在一起时,异构系统的内存模型是什么样的?如何对这种系统进行编程?如何整合多个设备的缓存一致性协议?我们接下来简单讨论这些问题,并概述设计空间。

异构系统的内存模型
如果两个设备A和B连接在一起并共享内存,这种情况下的内存模型是什么样的?一个符合直觉的答案是选择其中较弱的一个作为整体的内存模型,但如果两个内存模型无法比较,这种答案就不可行了。即使两者可以比较,可能也会有更好的答案。

四个设备组成的异构系统
在如上所示的异构系统中,C1和C2内存模型为SC,C3和C4内存模型为TSO。考虑下面的例子,在第一个例子中,有可能r1和r2同时读到0,但在第二个例子中插入了FENCE后,r1和r2就不能同时读到0了,但需要注意的是在SC的线程上仍然不需要插入FENCE,这种系统实际上产生了一个不同于SC和TSO的复合内存模型。

Dekker算法的例子
在这种系统中变成也是比较困难的,很难直接精确定义复合内存模型,更好的办法可能是使用HSA或OpenCL等进行编程。

异构系统的缓存一致性协议
通过分层缓存一致性来集成多个设备
考虑两个多核设备A和B,每个设备都有自己的内存模型,并通过不同的缓存一致性协议来实现内存模型,如上图所示。我们应该如何将两个设备集成到一个共享内存异构系统中,并将两个缓存一致性协议正确连接在一起?答案取决于每个设备的内存操作是否满足自己的内存排序规则。

分层缓存一致性

在分层缓存一致性系统中,本地缓存一致性控制器收到请求后,首先试图在本地满足该请求,如果无法满足就转发到全局一致性控制器,再转发到另一个设备的本地缓存一致性控制器。在这种设计中,全局控制器必须有足够丰富的接口来满足各个设备本地控制器发起的请求,且每个本地控制器必须用shim来扩展,作为两个控制器之间的接口转换。相关的一些例子可以参考原文。

减少异构系统缓存一致性的带宽需求

在异构系统中,内核之间的缓存一致性通信带宽可能成为性能瓶颈。一种解决思路是采用粗粒度的缓存一致性,比如在GPU本地以page大小的粒度进行跟踪,如果缓存未命中且已知该位置对应的page对GPU来说是私有的或只读的,就不需要访问全局的目录,而是可以从高带宽的总线从内存直接访问。

CPU-GPU系统中缓存一致性的一个低复杂度解决方案

我们可以采用选择性的GPU缓存,任何被映射到CPU内存的数据都不会缓存在GPU中,任何来自GPU内存的数据,如果目前被缓存在CPU中,也不会被缓存在GPU中。这个简单的策略可以很好地实现缓存一致性。为了实现这种方法,GPU维护一个粗粒度的目录,维护当前由CPU缓存的数据,当CPU访问GPU内存中的一个缓存块时,这个缓存块所在的区域就被插入到目录中,目录中所有的位置都不会被缓存到GPU中。不过这种方法也有坏处,即任何被CPU缓存的数据都必须从CPU中取回,为了解决这个问题需要进行进一步的优化,如GPU对CPU的请求进行合并、在GPU上加入一个特殊的CPU侧的缓存等。

热点内容
压缩包手机打开 发布:2025-05-15 18:37:34 浏览:216
安卓取消耳机模式怎么取消 发布:2025-05-15 18:24:24 浏览:58
气球怎么解压视频 发布:2025-05-15 18:20:00 浏览:782
电脑软件密码怎么设置密码 发布:2025-05-15 18:09:07 浏览:107
android应用是否运行 发布:2025-05-15 18:02:40 浏览:10
java排序list 发布:2025-05-15 18:02:40 浏览:298
net编译可以在linux上吗 发布:2025-05-15 18:01:18 浏览:533
华为怎么知道不是安卓 发布:2025-05-15 18:00:32 浏览:909
清理华为手机存储空间不足 发布:2025-05-15 17:54:46 浏览:349
java从控制台输入 发布:2025-05-15 17:47:38 浏览:483