type
status
slug
summary
tags
category
password
date
icon
以下讨论假设只有L1 Cache。且由于 I-Cache 要求串行取址,故这里只对 D-Cache 进行讨论。
Intro
D-Cache 缺失有两种情况:
- Load 缺失 - 此时需要从memory中取得数据,并在D-Cache中找到一个Cache Line写入。如果被写入的Cache Line是Dirty的,那么还需要先将这个Cache Line写到memory中去。
- Store 缺失 - 此时需要也需要从memroy中取得数据,并在D-Cache中找到一个Cache Line合并写入
这样引出了一个问题,即当发生D-Cache缺失而正在处理时,再次发生缺失该怎么办?
一个简单的做法是在D-Cache发生且还未被解决时,锁定Cache与内存间的数据通路,只处理当前缺失的数据,这样处理器就无法处理其他L/S指令了。但这样会大大减少程序执行时可以寻找的并行性,导致处理器性能无法提高,这个过程如下所示:
这种做法也称为
Blocking Cache
Non Blocking Cache
如果在发生缺失之后,仍然可以执行后续的L/S指令,则称为
Non Blocking Cache
,其对于处理器性能的提升非常有效果,如下所示:在这种情况下,L/S指令的D-Cache被处理完的时间可能与原始指令的顺序已经不一样了,为了处理这个问题,就需要保存发生缺失的L/S指令的信息,这样当D-Cache处理完后,才能正确的处理之前的数据。
处理这种情况的部件被称为 Miss Status/Information Holding Register
MSHR
,其包括两个部分:- 左侧为MSHR的本体,用来保存所有首次产生缺失的L/S指令信息,包括:
V
- valid位,用来指示当前的表项是否被占用,当首次发生缺失时,MSHR中一个表项会被占用。当所需要的Cache Line被取回时会释放一个占用的表项。Block Address
- 缺失Cache Line中数据块的公共地址。每当L/S指令发生缺失时,都会在MSHR中查找其需要的数据块是否在取回中。这样同一个块缺失只需要被处理一次,避免存储器带宽的浪费。Issued
- 表示首次发生缺失的L/S指令是否已经开始处理。由于存储器贷款有限,有些首次缺失并不一定马上就被处理,而是等到条件满足时才向内存发出读取请求。
- 右侧为Load/Store Table,每一个发生缺失的L/S指令,都会将自身的信息写到表中,其包括
V
- valid位,表示表项是否被占用。MSHR entry
- 指示发生缺失的L/S指令属于MSHR中的哪一个表项,不同缺失指令可能指向同一个表项,因为他们需要的Cache Line可能是相同的。Dest Register
- 对于Load来说,该部分记录了要载入数据的目的寄存器,当需要的数据被取回时,就可以把数据写入到该寄存器中。对于store指令来说,其指向了要写入数据在Store Buffer中的位置,当块被取回时,可以找到要写入的数据在Buffer中的位置并写入到块中,同时释放掉这条数据在Buffer中占用的空间。Type
- 记录访问存储器指令的类型,如LD LW
等,以便正确执行指令。Offset
- 记录缺失指令访问的地址在块中的偏移量,从而能够正确找到数据地址。
通过MSHR本体和Load/Store Table的合作可以完成Non Blocking Cache的功能,当一条访存指令发生缺失时,会将发生缺失的地址与MSHR中的Block Address进行比较:
- 如果发现了相同的表项,表明是再次缺失,此时只需要将指令信息写到Load/Store Table中即可。
- 否则是首次缺失,需要同时填写MSHR和Load/Store Table的信息。
当MSHR或Table的任意一个满了的时候,应该暂停流水线,等待之前的D-Cache缺失被处理完后,会空出新的表项,允许流水线继续执行。
Store Buffer
Store指令在顺利离开流水线之前是不可以改变处理器状态的,只有当其retire的时候才允许将其携带的数据写入到D-Cache中,在此之前即使Store计算完毕,也需要将结果暂存在一个Buffer中,也就是Store Buffer。
此时所有的Load指令不仅要访问D-Cache,还需要访问Store Buffer,如果Buffer中有相同地址的store指令,且该store指令在load之前进入流水线,那么就需要把Store的数据给load,而不是Cache中的数据。
Buffer中一条Store指令有三个状态:
- Un-complete - 没有执行完成
- Complete - 执行完毕
- retire - 顺利离开流水线
当store指令在流水线的Dispatch分发阶段时,会按照顺序占据Store Buffer的空间,此时为Un-complete的状态。
当store指令已经取到地址和数据的时候,就成为Complete状态
当store指令成为流水线中最旧的指令时,就会retire,此时该指令可以离开ROB;硬件会自动将Store Buffer中处于retire状态的store指令写到D-Cache中:
01-Fundamentals of Computer Design
Quantitative Approaches
Latency (Response Time) - 从开始到结束的时间是多少
Throughput - 在给定的时间内所做的工作量是多少
Elapsed Time - 总的响应时间,包括所有方面的处理(I/O, OS开销,空闲时间)
CPU Time - 处理给定作业所花费的时间
Classical CPU Time
Instructions
- 指令数
CPI
- Clock Cycle Per Instruction, 每条指令的平均时钟数;
Frequency
- 时钟频率
Performance Factor
Algorithm
- affects IC, possibly CPI
Programming language
- affects IC, CPI
Compiler
- affects IC, CPI
ISA
- affects IC, CPI, FrequencyAmdahl Law
Make the common case fast!
计算机体系结构的8
个主要思想
- 面向摩尔定律的设计
- 使用抽象简化设计
- 加速经常性事件
- 通过并行提高性能
- 通过流水线提高性能
- 通过预测提高性能
- 存储层次化 - Register → Cache → Memory → Disk → Tape
- 通过冗余提高可靠性
- 作者:fufu酱
- 链接:https://csfufu.life/article/119166b7-5648-80c9-a5ca-e509ef577e42
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章