type
status
slug
summary
tags
category
password
date
icon
💡
以下讨论假设只有L1 Cache。且由于 I-Cache 要求串行取址,故这里只对 D-Cache 进行讨论。

Intro

D-Cache 缺失有两种情况:
  1. Load 缺失 - 此时需要从memory中取得数据,并在D-Cache中找到一个Cache Line写入。如果被写入的Cache Line是Dirty的,那么还需要先将这个Cache Line写到memory中去。
  1. Store 缺失 - 此时需要也需要从memroy中取得数据,并在D-Cache中找到一个Cache Line合并写入
 
这样引出了一个问题,即当发生D-Cache缺失而正在处理时,再次发生缺失该怎么办?
 
一个简单的做法是在D-Cache发生且还未被解决时,锁定Cache与内存间的数据通路,只处理当前缺失的数据,这样处理器就无法处理其他L/S指令了。但这样会大大减少程序执行时可以寻找的并行性,导致处理器性能无法提高,这个过程如下所示:
notion image
这种做法也称为 Blocking Cache
 

Non Blocking Cache

如果在发生缺失之后,仍然可以执行后续的L/S指令,则称为 Non Blocking Cache,其对于处理器性能的提升非常有效果,如下所示:
notion image
在这种情况下,L/S指令的D-Cache被处理完的时间可能与原始指令的顺序已经不一样了,为了处理这个问题,就需要保存发生缺失的L/S指令的信息,这样当D-Cache处理完后,才能正确的处理之前的数据。
notion image
处理这种情况的部件被称为 Miss Status/Information Holding Register MSHR,其包括两个部分:
  1. 左侧为MSHR的本体,用来保存所有首次产生缺失的L/S指令信息,包括:
      • V - valid位,用来指示当前的表项是否被占用,当首次发生缺失时,MSHR中一个表项会被占用。当所需要的Cache Line被取回时会释放一个占用的表项。
      • Block Address - 缺失Cache Line中数据块的公共地址。每当L/S指令发生缺失时,都会在MSHR中查找其需要的数据块是否在取回中。这样同一个块缺失只需要被处理一次,避免存储器带宽的浪费。
      • Issued - 表示首次发生缺失的L/S指令是否已经开始处理。由于存储器贷款有限,有些首次缺失并不一定马上就被处理,而是等到条件满足时才向内存发出读取请求。
  1. 右侧为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中:
notion image

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, Frequency

Amdahl Law

📌
Make the common case fast!
 
计算机体系结构的8个主要思想
  1. 面向摩尔定律的设计
  1. 使用抽象简化设计
  1. 加速经常性事件
  1. 通过并行提高性能
  1. 通过流水线提高性能
  1. 通过预测提高性能
  1. 存储层次化 - Register → Cache → Memory → Disk → Tape
  1. 通过冗余提高可靠性
 
Benchmarking the Inference-time Training RobustnessHow to Writing an Effective Thesis Statement
Loading...
fufu酱
fufu酱
一个爱折腾的大学生
公告
👋
欢迎 欢迎来到fufu酱的blog! 💞️我是22级浙江大学竺可桢学院计算机科学与技术专业的学生 一个爱折腾的大学生 🌱我会在这个网站上更新我的笔记和工具分享 🌈目前all in MLLM 📫你可以用下面的方式联系到我
🍀
今後ともよろしくお願いします