gpt4 book ai didi

assembly - 数据缓存和指令缓存是什么意思?

转载 作者:行者123 更新时间:2023-12-02 14:26:38 25 4
gpt4 key购买 nike

来自 here :

Instructions and data have different access patterns, and access different regions of memory. Thus, having the same cache for both instructions and data may not always work out.

Thus, it's rather common to have two caches: an instruction cache that only stores instructions, and a data cache that only stores data.



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

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

例如 LDR R1, =myVar那么 LDR 会进入指令缓存,而 myVar 的内容会进入数据缓存吗?或者它不是那样工作的?

Instructions and data have different access patterns Could someone please elaborate?



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

"The idea is that if an instruction has been loaded from memory, it's likely to be used again soon" but the only way to know the next instruction is to read it. That means a memory read (you can't say it's already in cache because a new instruction is being red). So I still don't see the point? Say a LDR instruction just happened, so now LDR is in the data cache. Maybe another LDR instruction will happen, maybe it won't, we can't be sure so we have to actually read the next instruction - thus defeating the purpose of cache.

最佳答案

指令提取可以分块完成,假设大部分时间您将连续运行许多指令。因此指令提取可以更有效,每个事务可能有少量或更多时钟的开销,然后是内存准备数据的延迟,然后是事务大小的每个总线宽度的时钟。例如,8 个字或指令可以说是 5+n+8 个时钟,这比一次一条指令 (5+1+1)*8 更有效率。

数据另一方面,假设数据将在大部分时间顺序读取,因此额外的周期可能会受到伤害,只获取请求的数据(最多可达内存或总线的宽度,因为这是免费赠品)并不是那么好)。

在我所知道的 ARM 上,L1 缓存 I 和 D 是分开的,而 L2 是组合在一起的。 L1 不在 axi/amba 总线上,并且可能比 L2 和 amba/axi 的 L2 访问效率更高(几个周期的开销加上时间加上每个事务的每个总线宽度的数据一个时钟)。

对于标记为可缓存的地址空间(如果 mmu 处于打开状态),L1 和 L2 将获取缓存行而不是单个数据项,并且可能超过获取指令量的 I 数据。

您的每个 ldr 和 ldm 指令都将导致数据周期,如果地址可缓存,则可以进入 L2 和 L1 缓存(如果尚未存在)。如果指令本身在可缓存地址,则指令本身也会进入 L2 和 L1 缓存(如果尚未存在)。 (是的,有很多旋钮可以控制什么是可缓存的,什么是不可缓存的,不想涉及这些细微差别,只是为了讨论而假设所有这些指令获取和数据访问都是可缓存的)。

如果您有循环或再次运行该代码,您可能希望保存刚刚在缓存中执行的指令。此外,高速缓存行中的指令将受益于更高效访问所节省的开销。但是如果你只通过一小部分缓存线执行,那么总的来说这些周期是一种浪费,如果这种情况发生太多,那么缓存会使事情变慢。

一旦某些内容在缓存中,那么下次读取(或根据设置写入)时,将使用缓存副本,而不是慢速内存中的副本。最终(取决于设置)如果某个项目的缓存副本由于写入(str,stm)而被修改,并且需要将一些新访问保存在缓存中,那么旧的将被驱逐回慢速内存并从缓存减慢内存发生。指令没有这个问题,指令基本上是只读的,所以你不必将它们写回慢速内存,理论上缓存副本和慢速内存副本是相同的。

ldr r1,=myvar

将导致 pc 相对负载
ldr r1,something
...
something: .word myvar

ldr 指令将成为缓存行提取、指令提取(以及更多指令)的一部分。这些将保存在 ARM 上 L1 缓存的 I 部分和 L2 的共享部分(如果启用等)。当该指令最终执行时,某物的地址将经历数据读取,如果在该区域中为该读取启用了缓存,那么它也将进入 L2 和 L1 缓存(D 部分)(如果尚未存在)。
如果您立即循环并再次运行该指令,那么理想情况下该指令将位于 L1 缓存中,并且获取它的访问时间非常快,总共只有几个时钟。数据也将在 L1 缓存中,也将是一些要读取的时钟。

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

关于assembly - 数据缓存和指令缓存是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22394750/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com