“关键字优先与提前返回还区分所需字的返回时刻和整行传输完成时刻。在明示的首拍延迟与拍间隔下,可以逐字计算初次请求的等待;整条未决事务却要到最后一字才回收。若加入排队或竞争,必须重新定义罚时,不…”
形式陈述
一行有四个字,当前读取只要最后一个。下层正在逐字送回数据,是否必须等四个字全部到齐才能回答这次读取?又能否先把它要的那个字送来?这其实是两个问题:提前返回决定何时回答请求,关键字优先决定下层按什么次序送字。
本页沿用非阻塞未决事务的只读内存、地址分解、请求身份、资源重试和保留路合同。改变的是完成接口:不再一次 complete(t) 安装整行,而用 deliver(t,o) 交付事务
每条未决记录增加一个长度
一次合法 deliver(t,o) 执行:
- 验证原事务身份仍存活、偏移合法且
为假;失败时状态完全不变 - 写入
,置 ,令 - 只返回目标列表中偏移恰为
的请求,并把它们移出列表;其余目标继续等待 - 只有
时才将整行设为驻留有效,释放 MSHR 和路的保留关系
读取接口也增加一个分支:没有驻留命中,但找到同块事务且 FORWARD。它不占等待目标槽。若所需字尚未到达,则仍按目标容量作 MERGE 或 RETRY;普通 HIT、新块 MISS 与其他资源规则不变。
当前等待目标已经全部返回,不意味着事务可以释放。尚未到达的字仍属于这一原事务,路必须继续保留,旧身份仍可接收其余合法字。否则迟到字将失去可靠归属,或被错误送进一个重用位置的新事务。
假设初次建立事务的请求偏移为
它恰好遍历每个偏移一次。参考函数 critical_order(K,c) 只返回这个完整次序,不发起填充、不修改事务。驱动器也可按 deliver;返回值正确性与排列无关。
直觉
整行模式把“货到齐”和“顾客拿到所需商品”放在同一时刻。逐字模式把它们拆开:某位顾客已经拿到所需的字,可以继续自己的工作;负责接收整箱货的登记单却还不能撤掉。
正确性需要把前页的不变量细化。对于一条未决事务,
归纳时,deliver 的身份和重复检查确保每一偏移至多写入一次。它写入可信字后,只移动与该偏移有关的目标,因此不会提早回答另一字,也不会漏掉当前字的等待者。FORWARD 只在相应标记为真时读数据,不需要借用整行有效位。最后一个字到达时,所有
如果每条存活事务的所有未到达偏移最终都被交付,那么每个已接收读取最终返回,而且每条事务最终释放。只承诺“每个当前目标需要的字最终到达”还不够:其余字永不返回时,目标虽已完成,MSHR 和路会永久被占住。这是请求活性与资源回收活性的区别。
关键字优先没有改变这份安全证明。它只是把初次请求最需要的字排到前面。后来合并的读取可能需要另一个偏移,所以“初始请求更早返回”不能自动推成“所有请求都更早返回”。
例子与边界
取
| 交付偏移 | 这次返回的地址 | 接收标记,按偏移 0 至 3 | 事务存活 | 整行有效 |
|---|---|---|---|---|
| 3 | 12 | 假、假、假、真 | 是 | 否 |
| 0 | 0 | 真、假、假、真 | 是 | 否 |
| 1 | 无 | 真、真、假、真 | 是 | 否 |
| 2 | 无 | 真、真、真、真 | 否 | 是 |
第一拍后,地址 12 的值 62 已经返回。此时再次读 12 得到 FORWARD,也返回 62;目标列表只剩地址 0。再读新块首址 16 则得到 ways-reserved:还有空闲 MSHR,但唯一的路仍在接收块 0,不能抢走。
第二拍以后,所有现有等待目标都已得到结果,仍然要接收第三、第四拍。若这时直接删除记录,下一次 deliver 就找不到原身份。若为了“修复”而允许仅凭事务序号或组号投递,又可能把迟到数据写进另一个新事务。这两种错误都来自把目标列表为空误当成整行传输结束。
另一个错误是第一拍后就把整行设为有效。假定初始数据数组中偏移 0 仍是零,接着读地址 0,普通命中便会错误返回 0,而真正内存值为 11。逐字标记不是性能附加信息,而是部分填充期间的可读性证据。
为了谈时间,再额外规定一个服务模型:一条已经发出的事务第一字在
关键字优先加提前返回的等待是
这个例子也能显示后来请求的代价:偏移 0 在自然顺序的 20 时刻到达,旋转顺序则在 22 到达。若硬件不支持旋转突发、首字选择需要额外开销,或者下层存在排队,必须重建时间模型,不能直接移植上述公式。
推论与应用
参考程序提供独立的 BeatCache,没有给它整行 complete 接口。单字交付可乱序,重复偏移、旧身份和复制身份都原子拒绝。
等待目标的容量随实际响应释放。若
参考 deliver 扫描未决表和最多 critical_order 创建长度
把所有
终点任务要求同时交出请求返回表、整行有效位和未决记录寿命。只画“CPU 继续执行”的箭头会漏掉最关键的检查:它继续依赖的字必须真的到达,而未完成的整行仍要有唯一所有者。
参考资料
- Princeton COS375, Fall 2015, Cache lecture,PDF 第 32 页 “Block Size Increase: Fill Time”。区分所需字一到就继续与先请求所需字这两种机制;本文的逐字身份和回收协议是明确给出的教学模型。
- David Kroft, “Lockup-Free Instruction Fetch/Prefetch Cache Organization,” ISCA, 1981:原论文。逐字目标识别和返回数据的相关原始设计背景。