你能帮我理解ARM Cortex-A9上的缓存行为吗?

时间:2015-03-18 11:25:03

标签: caching arm cortex-a

我试图了解LOAD和/或STORE指令期间发生了什么。因此,我进行了4次测试,每次测量cpu周期数(CC)/缓存命中数(CH)/未命中数(CM)/数据读取数(DR)/写入数(DW)。

读完不同的计数器后,我只需刷新L1(I / D缓存)。

测试1:

LDRB    R3, [R4,#1]!
STR     R3, [SP,#0x48+var_34]

Results: 4 (CC) 3(CH) 1(CM) 1(DR) 2(DW)

的Test2:

 LDR     R3, [SP,#0x48+var_34]
 LDR     R3, [R3]

 Results: 4 3 1 2 1

Test3的:

LDR     R3, [SP,#0x48+var_38]
LDR     R3, [R3]
STR     R3, [SP,#0x48+var_30]

Results: 4 4 1 2 2 
var_30 is returned at the end of the current function.

TEST4:

LDR     R2, [SP,#0x48+var_34]
LDR     R3, [R2] 

Results: 4 3 1 2 1  

以下是我的理解:

1。缓存未命中

在每个测试中,我们有1个缓存未命中,因为当执行

LDR reg, something

"东西"将被缓存,并将有一个缓存未命中。

并且......这几乎是唯一的"逻辑"解释我可以做... 我不理解缓存命中,数据读取和数据写入的不同值。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

infocenter.arm.com上的arm文档非常清楚地说明了amba / axi文档中axi / amba总线上发生的事情。现在处理器到L1紧密耦合,而不是amba / axi,都在核心内部。如果您只是清除L1,那么L2可能仍然包含值,因此如果L2未命中,则一个实验与其他实验相比可能会显示不同的结果。此外,您不仅可以测量加载和存储,还可以获取指令,如果高速缓存行位于它们之间,它们的对齐将改变结果,即使有两条指令,性能也可能与它们在一起时不同。有一些实验可以根据一行内的对齐情况来确定何时以及是否有另一个缓存行提取出来。

同样试图在像这样的处理器上获得确定性数字有点困难,特别是在缓存开启时。如果你在裸机上运行这些实验,他们就没有理由期待任何有意义的结果。对于裸机,结果仍然是可疑的,但可以使其更具确定性。

如果您只是想了解不专门针对手臂或任何其他平台的缓存基础知识,那么只需谷歌,转到维基百科等等。缓存只是更快的内存,更接近处理器的时间以及快速(更昂贵)的sram。因此,很简单地,缓存会查看您的地址,在表或一组表中查找并确定命中或未命中,如果命中则返回值或接受写入数据并完成事务的处理器端(允许处理器继续但后来去写缓存,基本上是火和忘记)。如果一个未命中,那么它必须弄清楚缓存中是否有这个数据的空闲开口,如果不是它必须通过写出来驱逐某些东西,那么或者如果已经有一个空白点它可以做一个缓存行读取这通常比你要求的读数要大。以与l1相同的方式击中l2,命中或未命中逐出或依此类推,直到它击中一个获得命中的缓存层,或者直到它击中最终ram或从中获取数据的外围设备。然后在返回l1的路上写入所有缓存层,然后处理器获取它要求的一点点数据。如果处理器要求该缓存行中的另一个数据项现在它在l1并且返回非常快。 l2通常大于l1,所以l1中的所有内容都在l2中,但l2中的所有内容都不在l1中,因此你可以从l1逐出到l2然后如果有东西出现它可能会错过l1但是命中l2仍然要慢得多,要快得多。这有点像保持工具或参考资料或者您经常使用的任何东西在您的办公桌上更接近您,以及您不太经常离开的东西,因为您没有空间容纳所有东西,因为您更改项目或发展最常用的东西,最不经常的变化和桌面上的位置变化。