来自here:
说明和数据具有不同的访问模式和访问权限 不同的记忆区域。因此,两者都具有相同的缓存 说明和数据可能并不总是有效。
因此,拥有两个缓存是相当普遍的:指令缓存 仅存储指令,以及仅存储数据的数据缓存。
了解指令和数据之间的区别是直观的,但现在我不确定这种情况下的区别?什么构成数据并被放入数据缓存中,什么构成指令并被放入指令缓存?
我知道ARM组装。需要STR
,LDR
,LDMF
或STMFD
的任何内容都会使用数据缓存吗?但从技术角度讲STR
,LDR
,LDMF
和STMFD
都是说明,所以我这就是为什么我感到困惑。 “数据”必须始终存在“指令”吗?数据是否被.data
部分中的任何内容考虑?
例如LDR R1, =myVar
那么LDR会进入指令缓存而myVar的内容会进入数据缓存吗?或者它不能那样工作?
说明和数据具有不同的访问模式 有人可以详细说明吗?
我在一篇有用的帖子上发表的评论突显了我难以理解:
“我们的想法是,如果从内存中加载了一条指令,那就是 可能会很快再次使用“但是了解下一个的唯一方法 指令是阅读它。这意味着内存读取(你不能说 它已经在缓存中,因为新指令是红色的)。所以我 仍然没有看到这一点?说LDR指令刚刚发生,所以现在 LDR在数据缓存中。也许会发生另一个LDR指令, 也许它不会,我们不能确定所以我们必须实际阅读下一个 指令 - 从而破坏缓存的目的。
答案 0 :(得分:12)
指令提取可以在块中完成,并假设您将在很多时候连续运行许多指令。因此,指令提取可以更有效,每个事务可能有少量或更多的开销时钟,然后存储器使数据准备好的延迟,然后是事务大小的总线宽度的时钟。例如,8个字或指令可以说是5 + n + 8个时钟,这比一次一个指令(5 + 1 + 1)* 8更有效。
另一方面,数据假设数据将在大部分时间内按顺序读取,因此额外的周期可能会受到影响,只能获取所要求的数据(达到内存或总线的宽度)是免费赠品)。
在ARM上,我知道L1缓存I和D是分开的,L2是它们的组合。 L1不在axi / amba总线上,并且可能比L2更有效的访问,并且超出其范围是amba / axi(开销的几个周期加上时间加上每个事务的每个总线宽度的数据一个时钟)。
对于标记为可缓存的地址空间(如果mmu处于打开状态)L1,因此L2将获取缓存行而不是数据的单个项目,并且可能超过指令的I数据获取量取。
每个ldr和ldm指令将导致数据周期,如果地址可缓存,则进入L2和L1缓存(如果尚未存在)。如果在可缓存的地址处将进入L2和L1缓存(如果尚未存在),则指令本身也是如此。 (是的,有许多旋钮可以控制什么是可缓存的而不是,不想进入这些细微差别,只是为了讨论而假设所有这些指令提取和数据访问都是可缓存的。)
如果您有循环或再次运行该代码,您可能希望保存刚刚在缓存中执行的指令。此外,缓存行中的后续指令将受益于更高效访问所节省的开销。但是如果你只执行一小部分缓存行,那么总体来说这些周期是浪费,如果这种情况发生得太多,那么缓存会使事情变慢。
一旦某些内容在缓存中,则下次读取(或根据设置编写)时,缓存副本将被使用,而不是慢速内存中的副本。最终(取决于设置)如果某个项的缓存副本由于写入(str,stm)而被修改,并且某些新访问需要保存在缓存中,那么旧的访问将被逐出缓慢的内存和写入来自缓存使缓慢的内存发生。你没有指令的这个问题,指令基本上是只读的,所以你不必把它们写回慢速内存,理论上缓存副本和慢速内存副本是相同的。
ldr r1,=myvar
将导致pc相对负载
ldr r1,something
...
something: .word myvar
ldr指令将成为缓存行提取,指令提取(以及更多指令)的一部分。这些将保存在手臂上的L1缓存的一部分和L2的共享部分(如果启用等)。当最终执行该指令时,某些内容的地址将经历数据读取,如果在该区域中为该读取启用了缓存,那么它也将进入L2和L1缓存(D部分)(如果尚未存在)。 如果你循环并立即再次运行该指令,那么理想情况下,指令将在L1缓存中,并且获取它的访问时间非常快,少数时钟总计。数据也将存在于L1缓存中,也将是少数几个要读取的时钟。
上面提到的5 + n + 8,有一些开销时钟(5只是一种可能性,它可以通过设计和并行的其他方式来改变)。 N取决于较慢的内存速度。对于dram来说,n非常大,所以高速缓存l2和L1要快得多,这就是为什么缓存完全可以减少每个dram访问的大量时钟周期,有效与否。
答案 1 :(得分:5)
指令缓存将包括从内存中提取以执行的缓存行。数据高速缓存将包括从内存中提取的高速缓存行,以便作为数据加载到寄存器中。
答案 2 :(得分:3)
指令缓存只是更快地访问指令的另一级内存。它不是cpu的发条/内部部件/ fetch-decode-execute逻辑的一部分 - 但是你可以命名它。
当有人说缓存指令意味着,它非常接近cpu内存级别,因此当cpu需要在地址X加载指令时,与其他地址Y相比,它的速度非常快。
CPU内部不会缓存指令。
说明和数据有不同的访问模式有人可以详细说明吗?
例如,更新(覆盖)指令是不赞成的,这并不常见。因此,如果您为指令设计缓存,则可以针对读取进行优化。指令也是顺序的,所以如果cpu访问N处的指令,它很可能也会访问N + 1处的指令。但是,这两个属性对于数据缓存来说同样重要,或者数据缓存必须更加详细。
答案 3 :(得分:-1)
考虑到例如臂。为简单起见,我们假设:
当核心执行时,PC具有 VA (以下称为 PA )。此时,没有人知道 PA 是否有数据或指令。此外,由于这是第一次触发此地址,因此不会有任何缓存分配。因此硬件将在 L1 I缓存,L1D和L2D 中查找并找不到任何内容。
它通过 MMU 步行(MMU也找不到 TLB 中的地址),最后从最终内存中提取内容。现在我们有 PA 的内容,可以是数据或指令。
在I缓存中分配:
根据来自PC的地址获取的任何数据都被视为指令,并自动分配到I缓存中。解码单元尚未使用。如果解码单元发现其无效指令,那么它将无论如何中止,因此中止/异常逻辑将驱逐/无效来自I高速缓存的指令。此外,预取引擎可以参考上面使用的 PA 来获取接下来的几条指令。
在D缓存中分配:
解码单元确定其加载或存储并将控制传递给LoadStore单元后,数据将从L1D缓存中分配/检索。
因此,下一次下一个地址到达PC并且它通过相同的链后,当前地址被引用/检查 L1I 中的内容以获取指令以及存在命中的任何地方,当前地址内容是从TLB中提取的