assembly 直接Map缓存如何返回数据?

lzfw57am  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(156)

我正在上Patterson & Hennessey的《计算机组织与设计》教科书中的计算机体系结构和组装的第一堂课。我目前正在学习缓存。我知道CPU将检查该高速缓存的1.缓存块的索引,2.该块中的有效位,3.有效标记。如果有效,数据将从那里发送到处理器。
我很难想象这是一真实的东西。例如,我们可能想从$x到$y加载一个字。处理器得到一个地址,比如0x 12345670来表示$x。所以“0”是偏移量,“67”是索引,其余的是标记。我们该高速缓存中得到了一个命中,但是数据在哪里呢?2这个地址是数据吗?3该高速缓存中是否有更多的空间来保存我们需要的数据?4它是否直接将您发送到内存中的那个位置?5假设数据在那里,我们如何通过缓存从$x获取数据。
同样假设32位字长,您将地址发送到该高速缓存,并返回一个完整的字,还是仅返回足够的位?
PS.从真实的例子中学习对我来说是最有帮助的,所以如果你有关于这方面的实践资源(和mips编程,特别是非叶子函数),我也会非常感激。

ryhaxcpt

ryhaxcpt1#

缓存不是一个编程的东西,如果你想知道一些真实的例子,请查看openocores.org;那里至少有几个内核中有缓存(你必须阅读vhdl/verilog)。
在这一点上,理解这本教科书是一本教科书mips也没有其他人做了一个处理器,遵循确切的模型;像这样的设计要么从来没有发生过,要么在一段时间前就停止了。许多人从那本书中学到了东西,所以我们经常使用这些术语-但管道更深,更不同,缓存大多相同,但大小和宽度可以不同,而且肯定是关于如何确定谁输了,谁被驱逐。
缓存通常被描述为具有一定数量的字节,例如64 K字节的缓存。这些字节保存数据。从慢端读取的数据,DRAM/主存储器被缓存或存储该高速缓存中。这是它的所在地。
当您读取0x 12345670处的字节时,假设该高速缓存线为256个字节,那么如果你得到一个未命中,那么从慢/DRAM侧的读取是在0x 12345600的等价物。如果你得到一个未命中,该高速缓存被设计成确定在该高速缓存中的哪里将存储其中具有你的字节的高速缓存行。如果有其他人在那里,那么他们的数据需要被驱逐。(发生了一些写操作)然后,在DRAM将缓存行读取该高速缓存之前,数据被写入DRAM,最后,字节被发送给您(更有可能是总线宽度,32或64位被发送给你,处理器将字节通道与之隔离)。如果该高速缓存线是空的,或者如果那里的数据不需要写回DRAM,那么缓存只需要从DRAM/慢速存储器端读取包含你的字节的线,并传送你的字节。
写是非常相似的,但如上所述,如果有命中,那么读-修改-写发生,你完成了。如果有未命中,那么做的东西必须被驱逐,然后从缓慢的内存读取,则发生读-修改-写。理想情况下,某个位置的位由该高速缓存设置,以便它知道该高速缓存行比DRAM中的副本新,并且当被逐出时,它需要被写入DRAM,它不能被丢弃。
该高速缓存还可以作为一个方便的存储器,并转发到速度较慢的DRAM。您希望限制不必要的DRAM访问,如果您希望将一个字节写入DRAM,您不希望读取DRAM内存/总线宽度,请修改该字节并以这些速度将其写回,你想在该高速缓存的sram中这样做。高速缓存允许速度较慢的一方将其所有的事务都保持在一个最佳大小。在处理器内核和系统内存之间可以有多个高速缓存,因此不是所有的高速缓存都将这样做或必须这样做,但最好是最后一个高速缓存。
如果我有一个256字节缓存线的缓存,那么低8位是该高速缓存线的偏移,你不会使用这些剩余的寻址。如果我有一个128 K字节的缓存,256字节的缓存线,这意味着我可以容纳512个东西。我需要9位从512个东西中挑选。其中一些位来自剩余的地址位(0x 123456)。这样我就可以确切地知道这是内存空间中的哪256个字节,无论地址中剩余的位都必须与缓存行沿着存储。因此,一个超级简单的1将是4的低位,0x 56用于查找512行中的哪一行,剩余的0x 1234减去该lsbit 0 b 000100100011010必须作为查找的一部分存储该高速缓存中(实际的标签)。因此,我需要512 * 15位的RAM用于标签本身,再加上一些位来标记有效/无效和脏/干净。
该高速缓存线大小和开销之间有一个微妙的平衡。就性能而言,缓存是一场赌博,您总是可以击败它们,并找到一个基准,使缓存比没有缓存更差。缓存线越小,每个事务的浪费就越少,如果你在内存中随机读取一个字节,这意味该高速缓存为你的每个字节阅读256个字节,不是很有效,所以每一行64位对你的8是不那么痛苦的。但是如果你的程序更多的是线性的,字符串复制,程序不太分支,那么一个更大的缓存行可能是有用的。该高速缓存行越大,你必须存储的标签就越小,内存就越少,总的来说开销也就越小。

你也可以有多路而不是上面的512个256字节的高速缓存行。我可能会选择7个地址位而不是8个,并且有4路。如果我有一个每次读取跳转0x 100字节的程序,那么一条缓存线将被占用,而其他511条缓存线不会被使用太多。(7)从地址上看,有若干种方式一个地址有四个可能的着陆点之一,并且该逻辑在这四个位置中寻找命中,并且如果它们都未命中,则它们中的任何一个未被使用,如果不是,则存在一种算法来确定谁得到逐出(最后一个或随机数发生器,或循环等)。如果我跳了0x 100一位,那么至少有4行被使用,而不是1。希望赌博得到回报,程序回来使用其中的一些行。
这些都应该以某种形式用某种语言写在你的教科书里。
这是一个简单的例子,并没有涵盖整个现实情况。你正在为某家公司接电话,老板疯了,他命令你在任何时候都不能有超过16条留言/便条,否则你必须把这些留言/便条带给员工。你接了一个电话,写下雇员的名字和信息。重复。在你达到16岁或之前,你必须用运动鞋网(走)给员工留言。如果你到了16个电话,你就不能再接任何电话了,除非你至少打了一个电话,腾出一个空位。假设这就像过去一样,电话一直响,直到你拿起它(你是电话答录机)。如果在你把纸条交给员工之前,你又接到了一个电话,你可以把第二个信息写在同一张纸条上,它不计为2。2笔记是一个高速缓存行。3雇员姓名是标签,消息是该高速缓存行中的字节。16是我可以在这个缓存中存储的缓存线总数。你的眼睛是一个逻辑,它看笔记,看看是否有命中或未命中,同样,你决定在时间到来时驱逐。你可以从你的办公桌上每次交付不止一个。所以你要设计你的手机缓存来决定你是否想总是等到你有16个纸条之前,你传递一个/一些希望使更少的行程,如果有人得到一个以上的消息,或者是一收到就马上交付,或者是介于两者之间。你无法预测什么时候会有电话来,所以你无法完美地设计解决方案,但目标是在有人注意在这个幻想中,员工不关心从呼叫发生到他们得到消息的等待时间是多少,只要所有的消息最终都被传递。没有涵盖真实的的内存缓存问题和解决方案,但可能会帮助你思考它,可能会让你的理解更糟,如果这样的话,对不起。
一般来说,作为一个程序员该高速缓存只是内存系统的一部分,它使你的计算机工作,你实际上并没有与它交谈,你一般使用处理器的内存空间分配给你的程序做的东西。想要有一个字符串和操作它,你这样做。你的程序本身是对缓存的作用最有可能,通常情况下,您不需要纠结于循环的位置或它们如何对齐。您可能也不会考虑MMU,它可以/确实会使您认为是操作系统提供给您的线性地址空间实际上在物理内存中分段,然后这些分段如何命中如果你编写一个程序运行在Windows或Linux或Mac或iOS或Android上,你不知道MMU/缓存配置在你的高级程序后面。裸机确保你在控制中,你可以转动你可以转动的旋钮(mmu,代码和数据对齐和条带化)。一些系统/芯片你可以读取该高速缓存的维度,有些你可以乱用参数。在那种/那些情况下,你可以得到乐趣,要么显示该高速缓存是很大的帮助和/或显示缓存是使代码运行缓慢。

编辑

“67”将是索引
我会说不,但如果你认为这是正确的,那么好。
但数据在哪里呢?
它该高速缓存中,在网上搜索“缓存”这个词,或者在字典中查找它。缓存保存着数据。
问题中的地址是否为数据?
所述地址全部或部分成为标签。
该高速缓存中是否有更多的空间来保存我们需要的数据?
数据在该高速缓存中。
它是否直接将您发送到内存中的该位置?
如果有未命中,则从主内存读取数据并存储该高速缓存中,然后至少将您请求的部分发送给您。
同样假设32位字长,您将地址发送到该高速缓存,并返回一个完整的字,还是仅返回足够的位?

由总线的设计和实现决定。读取以32位或64位为单位并不罕见,处理器从这些单位中提取字节或它所寻找的任何内容。这并不是低效的,在现代处理器上通常效率更高。在这些单位中尽可能多地执行操作,使用字节大小的变量会降低性能。从技术上讲,它可能会保存内存,但20世纪70年代很久以前就结束了,你有足够的内存。通常写是那些大小很重要的事情,通常要么是一个字节掩码,指示总线的哪些字节有真实的数据需要存储,要么是一个大小,总线使用数据总线位0到N-1。
PS.从真实的例子中学习对我来说是最有帮助的,所以如果你有关于这方面的实践资源(和mips编程,特别是非叶子函数),我也会非常感激。
Opencores.org 有几个处理器,其中有缓存。

相关问题