2017-12-18 301 views
-1

如果缓存未命中发生,数据将被直接从主存储器移到注册中,或者数据先移到缓存然后注册?有直接的方式连接寄存器和主内存吗?如果缓存未命中发生,数据将直接移动到寄存器或首先移动到缓存然后注册?

+0

当你说“移动到直接从主内存中注册”,你真的意思是“复制直接从主内存中注册,并*还*复制到缓存”?否则,缓存有什么用处?绕过缓存通常会让你的程序变慢(因为直接内存访问比缓存慢)。你能否详细说明*为什么要绕过缓存?什么是你想解决的*实际*问题?什么是用例? –

+0

http://idownvotedbecau.se/beingunresponsive –

+0

@Someprogrammerdude我的意思是在电路中,将数据放入缓存的同时将数据放入缓存中?我知道数据将被放入缓存(LLC,L2,L1),但是我关心的是,在将数据放入缓存中并将数据放入缓存之间有一个序列? – peasantspring

回答

2

我想你是问缓存未命中负载是否必须等待缓存行从外部缓存到达后的L1负载使用延迟。即等待线路写入L1,然后正常重试负载。

我几乎可以肯定,高性能的CPU不会那样工作。 L2命中延迟对于许多工作负载很重要,并且您需要一个加载缓冲区来跟踪传入的缓存行,以知道何时重新启动加载。因此,您只需抓取数据,并将其写入缓存。 TLB检查已经完成,作为生成物理地址发送到外部缓存的一部分。

大多数实际的CPU使用早期重新启动设计,只要等待的字/字节到达,流水线就会重新启动,因此缓存行的其余部分将在“后台”中传输。

进一步优化是关键词优先,它要求缓存行从需要的单词开始发送,因此缓存行中间的单词需求未命中可以首先接收该单词。我认为现代DDR DRAM在从主存储器读取时仍然支持这一点,在指定的64位块开始64字节的突发。尽管如此,我并不是100%确定现代乱序CPU使用这种方法;当无序执行允许同一行出现多个未完成的未命中时,可能会使其更加复杂。

请参阅which is optimal a bigger block cache size or a smaller one?了解早期重新启动和关键词优先的一些讨论。


是否有直接的方式连接,与主内存寄存器?

这取决于你的意思是“直接”。在现代高性能CPU中,将会有2或3层高速缓存和一个内存控制器,并拥有自己的缓冲区来仲裁多个内核的内存访问。所以不,你不能。

如果您设计了一个简单的单核CPU,并使用特殊的缓存绕过加载和存储指令,那么当然可以。或者,如果您将早期重新启动视为“直接”,那么它已经发生。

对于商店,x86和其他一些体系结构有缓存绕过存储,但x86的MOVNT指令不直接连接寄存器和内存。商店进入一个填满缓冲区,填满时刷新,所以你得到写入组合。还有不可缓存的内存区域:对不可缓存内存的加载或存储在体系结构上是“直接”的,但在实际的微体系结构中,它仍然通过L1D使用的相同机制从加载/存储执行单元经过内存层次结构与内存控制器交谈。

+0

非常感谢你! – peasantspring

相关问题