【问题标题】:What is meant by data cache and instruction cache?数据缓存和指令缓存是什么意思?
【发布时间】:2014-04-19 03:20:33
【问题描述】:

来自here

指令和数据有不同的访问模式,并且访问 不同的记忆区域。因此,两者具有相同的缓存 说明和数据可能并不总是有效。

因此,有两个缓存是很常见的:一个指令缓存 只存储指令,一个只存储数据的数据缓存。

知道指令和数据之间的区别很直观,但是现在我不确定在这种情况下的区别?什么构成数据并放入数据缓存,什么构成指令并放入指令缓存?

我知道 ARM 汇编。需要STRLDRLDMFSTMFD 的东西会使用数据缓存吗?但从技术上讲STRLDRLDMFSTMFD 都是指令,所以我这就是为什么我很困惑。 “数据”必须始终与“指令”一起存在吗? .data 部分中的数据是否被视为任何内容?

例如LDR R1, =myVar 那么LDR 会进入指令缓存而myVar 的内容会进入数据缓存吗?还是那样不行?

指令和数据有不同的访问模式 有人可以详细说明吗?

我在一篇有用的帖子上发表的这条评论突出了我的理解困难:

“这个想法是,如果一条指令已经从内存中加载,它是 可能很快会再次使用”,但唯一的方法是知道下一个 指令是阅读它。这意味着内存读取(你不能说 它已经在缓存中,因为一条新指令是红色的)。所以我 还是不明白重点?假设刚刚发生了一条 LDR 指令,那么现在 LDR 在数据缓存中。也许会发生另一条 LDR 指令, 也许不会,我们不能确定,所以我们必须真正阅读下一个 指令 - 从而破坏了缓存的目的。

【问题讨论】:

    标签: assembly arm cpu-architecture cpu-cache


    【解决方案1】:

    指令获取可以分块进行,假设大部分时间您将连续运行许多指令。因此指令获取可能更有效,每个事务可能有少量或更多时钟的开销,然后是内存准备好数据的延迟,然后是事务大小的每个总线宽度的时钟。例如,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 缓存的 I 部分和 L2 的共享部分(如果启用等)。当该指令最终执行时,某物的地址将经历一次数据读取,如果在该区域中为该读取启用了缓存,那么它还将进入 L2 和 L1 缓存(D 部分)(如果尚未存在)。 如果您立即循环并再次运行该指令,那么理想情况下该指令将位于 L1 缓存中,并且获取它的访问时间非常快,总共只有几个时钟。数据也将在 L1 缓存中,并且需要几个时钟来读取。

    我上面提到的 5+n+8,一些时钟的开销(5 只是一种可能性,它可以根据设计和其他并行发生的情况而变化)。 N 取决于较慢的内存速度。 n 对于 dram 来说非常大,所以缓存 l2 和 L1 快得多,这就是为什么缓存的存在是为了减少每次 DRAM 访问的大量时钟周期,无论是否有效。

    【讨论】:

    • 如果您查看 arm 处理器的 TRM(技术参考手册)并从 arm 获取 AMBA/AXI 规范,那么您可以看到每种访问类型涉及多少步骤。查看 axi 总线控制线,指示什么样的访问、权限、是否可缓存等。
    • “指令提取可以分块完成”这是另一种说法,缓存行通常大于单个指令吗?
    • 是的,缓存行大于一条指令,否则有什么意义?
    【解决方案2】:

    指令高速缓存将包括从内存中取出以供执行的高速缓存行。数据缓存将包括从内存中获取的缓存行,以作为数据加载到寄存器中。

    【讨论】:

    • 你能举个例子吗?比如LDR R1, =myVar那么LDR会进入指令缓存,而myVar的内容会进入数据缓存吗?
    • 是的,就是这样。
    • 缓存LDR指令有什么意义?以这种方式转换操作码是否更快?
    • @Celeritas 指令缓存不缓存操作码,而是缓存特定指令。缓存指令在循环(重复执行相同的代码)中特别有用,但即使没有循环从不同位置调用函数,也可以重用代码。缓存还有助于预取和利用空间局部性。
    • @Celeritas 我的意思是,使用 Icache,而不是总是有 fetch [wait for memory]/decode/execute 处理器更经常有 fetch [cache hit]/decode/execute 是否因为代码是最近执行的(循环或最近的函数调用),或者是因为连续指令被“预取”,因为缓存是按块填充的(x86 实现通常使用 64B 缓存块)。
    【解决方案3】:

    指令缓存只是另一层内存,可以更快地访问指令。它不是 cpu 发条/内部部件/获取-解码-执行逻辑的一部分——但是你可以命名它。

    当一个指令被缓存时,他们的意思是,它非常接近 cpu 内存级别,所以当 cpu 需要在地址 X 加载指令时,与其他地址 Y 相比,它的速度非常快。

    CPU 内部不缓存指令。

    指令和数据有不同的访问模式 有人可以详细说明吗?

    例如,不赞成更新(覆盖)指令,这并不常见。因此,如果您为指令设计缓存,则可以针对读取进行优化。指令也是顺序的,所以如果 cpu 在 N 处访问指令,它很可能也会在 N+1 处访问指令。然而,这两个属性对于数据缓存来说可能没有那么重要,或者数据缓存必须更加详细。

    【讨论】:

    • 那么,对于指令缓存,更快的 RAM 速度是否意味着更快地检索指令块?
    【解决方案4】:

    考虑到例如手臂。为简单起见,我们假设:

    • VA->PA 是 1:1 映射的
    • MMU 属性设置为可缓存和可共享
    • 只有 L1I 和 L1D 和 L2D 缓存

    当一个核心执行时,PC有一个VA(以下简称PA)。此时没有人知道PA 是否有数据或指令。而且由于这是第一次命中该地址,因此不会有任何缓存分配。因此,Hardware 会在 L1 I 缓存、L1D 和 L2D 中查找,但一无所获。

    它经过 MMU 遍历(MMU 也无法在 TLB 中找到地址),最后从最终内存中获取内容。现在我们有了来自该 PA 的内容,可以是 datainstruction

    I 缓存中的分配

    根据地址从 PC 获取的任何数据都被视为指令,并自动分配到 I 缓存中。解码单元尚未使用。如果解码单元发现其无效指令,那么它将无论如何中止,因此中止/异常逻辑将从 I 高速缓存中逐出/无效指令。此外,预取引擎可以参考上面使用的 PA 来获取接下来的几条指令。

    D 缓存中的分配

    一旦解码单元计算出它的加载或存储并将控制权传递给 LoadStore 单元,数据就会在 L1D 缓存中分配/检索。

    所以下一次地址到达 PC 时,它会通过相同的链,当前地址被引用/检查与 L1I 中的内容以获取指令,并且无论哪里有命中,当前地址内容是从 TLB 中获取的

    【讨论】:

      猜你喜欢
      • 2014-05-10
      • 2023-03-12
      • 2015-01-17
      • 2012-09-18
      • 2023-03-25
      • 1970-01-01
      • 2017-05-12
      • 2015-03-22
      • 2020-06-01
      相关资源
      最近更新 更多