如果缓存未命中发生,数据将被直接从主存储器移到注册中,或者数据先移到缓存然后注册?有直接的方式连接寄存器和主内存吗?如果缓存未命中发生,数据将直接移动到寄存器或首先移动到缓存然后注册?
回答
我想你是问缓存未命中负载是否必须等待缓存行从外部缓存到达后的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使用的相同机制从加载/存储执行单元经过内存层次结构与内存控制器交谈。
非常感谢你! – peasantspring
- 1. 我可以将存储在_m128 SSE寄存器中的浮点数直接移动到正常寄存器吗?
- 2. 从DX:AX寄存器移动到单个32位寄存器
- 3. 直接映射缓存和缓存未命中
- 4. 移动服务缓存
- 5. 光油缓存移动
- 6. X86操作码将xmm寄存器移动到通用寄存器
- 7. 虽然移动重定向存在drupal缓存的缓存问题
- 8. 缓存或寄存器 - 哪个更快?
- 9. 移动另一个寄存器EBP注册
- 10. Verilog移位寄存器接口到AVR
- 11. 未将数据复制到寄存器
- 12. datomic缓存和缓存未命中
- 13. Asp.net缓存或手动缓存
- 14. 内存数据寄存器(MDR)与内存缓冲寄存器(MBR)
- 15. 移动Safari中的HTML5缓存清单
- 16. 86 64 AT&T,移动寄存器的部分到另一个寄存器
- 17. 将内存操作数移动到段寄存器,程序集(x86)
- 18. 缓存行动永远直到失效
- 19. OSCache jsp标记首先从缓存中返回,然后清除
- 20. 移动设备上数据驱动应用程序的首选缓存策略
- 21. 将gradle临时缓存目录移动到其他目录
- 22. 如何将数据存储在存储器或寄存器中
- 23. 缓存数据,直到更改
- 24. 缓存支出:移动服务器与服务器开发
- 25. 当直接映射缓存中存在偏移量时,如何将内存地址映射到块?
- 26. 直接stdout缓存
- 27. NASM - 如何将8位寄存器移动到完整的32位寄存器中?
- 28. 如何在MIPS中将浮点寄存器的值移动到通用寄存器?
- 29. 移动和HTML清单缓存性能
- 30. jQuery的移动预取/缓存图像
当你说“移动到直接从主内存中注册”,你真的意思是“复制直接从主内存中注册,并*还*复制到缓存”?否则,缓存有什么用处?绕过缓存通常会让你的程序变慢(因为直接内存访问比缓存慢)。你能否详细说明*为什么要绕过缓存?什么是你想解决的*实际*问题?什么是用例? –
http://idownvotedbecau.se/beingunresponsive –
@Someprogrammerdude我的意思是在电路中,将数据放入缓存的同时将数据放入缓存中?我知道数据将被放入缓存(LLC,L2,L1),但是我关心的是,在将数据放入缓存中并将数据放入缓存之间有一个序列? – peasantspring