MIPS r10000 如何获取隐藏指令缓存延迟?
How does MIPS r10000 fetch hide instruction cache latency?
我正在研究 mips r10000 的不同流水线阶段。论文说
该处理器每次每个周期从指令缓存中获取 4 条指令。但是指令缓存的延迟必须超过一个周期,虽然我不知道指令缓存的确切命中延迟,Haswell 处理器中的 L1 数据缓存的命中延迟大约是 4 个周期。
因此,如果我们假设 L1 指令缓存延迟为 3-4 个周期,处理器如何在每个周期获取 4 条指令?
MIPS R10000 有一个单周期延迟指令高速缓存,可以在高速缓存块 中获取连续的四个指令块,而无需对齐约束。
从机制上讲,这可能意味着它使用了至少部分独立寻址的四个 SRAM 组(缓存组地址解码可以共享)。
由于每个存储体都是独立可寻址的,如图所示,可以访问十六个字中包含的任何连续的四个字序列。寻址行 [0, 0, 0, 0] 得到单词 [0, 1, 2, 3](单词 0-3); rows [1, 0 , 0, 0] 获取单词 [4, 1, 2, 3](单词 1-4); rows [1, 1, 0, 0] 获取单词 [4, 5, 2, 3](单词 2-5); ...; rows [3, 3, 3, 2] 获取单词 [12, 13, 14, 11](单词 11-14);行 [3, 3, 3, 3] 获取单词 [12, 13, 14, 15](单词 12-15)。
(同一个银行可以跨越缓存块边界,但随后必须并行确认两次缓存块命中。对先前访问方式的记忆将减少这对顺序检查的常见情况的一组检查在较大的缓存块中访问;一组将使用 memoized 方式,另一组将在进入新缓存块时执行正常检查。页面交叉是一个类似的问题。)
(多指令获取的常见替代方法确实具有自然对齐块的对齐约束,例如 16 字节。)
直到在第二个流水线阶段(解码)中检测到一个分支,该处理器才重定向指令获取,因此即使预测正确,采用的分支也会引入单周期气泡。直到一些周期之后才能确定不正确的预测,因为在第四个流水线阶段开始执行 和 指令是乱序执行的。 (错误预测的采用分支可能会解码已经在采用分支气泡中提取的指令,因为这些指令存储在 "resume cache" 中。)
指令缓冲可以消除由于数据依赖性和其他危险而导致吞吐量很少接近最大值的危险。
一般来说,缓存可以在每次提取时提供多个字(自然对齐限制有助于单个存储体提供块)或每个周期访问多次(例如,比指令缓存的其他部分更深入地流水线化指令缓存)流水线或使用昂贵的多端口 SRAM)。
只要每个周期都提供一个新地址,每个周期都可以获取多个连续的指令。如果每个周期有两个地址可用(预测),则可以在同一周期中获取分支之后的指令。 (另一种减少采取的分支惩罚的方法——并提供其他 post 分支优化机会——是使用跟踪缓存。)
我正在研究 mips r10000 的不同流水线阶段。论文说 该处理器每次每个周期从指令缓存中获取 4 条指令。但是指令缓存的延迟必须超过一个周期,虽然我不知道指令缓存的确切命中延迟,Haswell 处理器中的 L1 数据缓存的命中延迟大约是 4 个周期。
因此,如果我们假设 L1 指令缓存延迟为 3-4 个周期,处理器如何在每个周期获取 4 条指令?
MIPS R10000 有一个单周期延迟指令高速缓存,可以在高速缓存块 中获取连续的四个指令块,而无需对齐约束。
从机制上讲,这可能意味着它使用了至少部分独立寻址的四个 SRAM 组(缓存组地址解码可以共享)。
由于每个存储体都是独立可寻址的,如图所示,可以访问十六个字中包含的任何连续的四个字序列。寻址行 [0, 0, 0, 0] 得到单词 [0, 1, 2, 3](单词 0-3); rows [1, 0 , 0, 0] 获取单词 [4, 1, 2, 3](单词 1-4); rows [1, 1, 0, 0] 获取单词 [4, 5, 2, 3](单词 2-5); ...; rows [3, 3, 3, 2] 获取单词 [12, 13, 14, 11](单词 11-14);行 [3, 3, 3, 3] 获取单词 [12, 13, 14, 15](单词 12-15)。
(同一个银行可以跨越缓存块边界,但随后必须并行确认两次缓存块命中。对先前访问方式的记忆将减少这对顺序检查的常见情况的一组检查在较大的缓存块中访问;一组将使用 memoized 方式,另一组将在进入新缓存块时执行正常检查。页面交叉是一个类似的问题。)
(多指令获取的常见替代方法确实具有自然对齐块的对齐约束,例如 16 字节。)
直到在第二个流水线阶段(解码)中检测到一个分支,该处理器才重定向指令获取,因此即使预测正确,采用的分支也会引入单周期气泡。直到一些周期之后才能确定不正确的预测,因为在第四个流水线阶段开始执行 和 指令是乱序执行的。 (错误预测的采用分支可能会解码已经在采用分支气泡中提取的指令,因为这些指令存储在 "resume cache" 中。)
指令缓冲可以消除由于数据依赖性和其他危险而导致吞吐量很少接近最大值的危险。
一般来说,缓存可以在每次提取时提供多个字(自然对齐限制有助于单个存储体提供块)或每个周期访问多次(例如,比指令缓存的其他部分更深入地流水线化指令缓存)流水线或使用昂贵的多端口 SRAM)。
只要每个周期都提供一个新地址,每个周期都可以获取多个连续的指令。如果每个周期有两个地址可用(预测),则可以在同一周期中获取分支之后的指令。 (另一种减少采取的分支惩罚的方法——并提供其他 post 分支优化机会——是使用跟踪缓存。)