测量 ARM Cortex-A15 的缓存访问时间/周期

Measure cache access time/cycles for the ARM Cortex-A15

本文关键字:时间 周期 访问 缓存 ARM Cortex-A15 测量      更新时间:2023-10-16

所以我测量了访问ARM Cortex-A15的L2缓存的周期。我通过分配一个字节和

  • 使地址无效
  • 阅读 PMCCNTR 登记册
  • 使用 LDR 访问分配字节的内存位置
  • 再次读取 PMCCNTR 寄存器
  • 从第二个测量值中减去第一个测量
缓存

访问大约有 ~240 个周期,非缓存访问有 ~350 个周期。我还使用了ISB,DMB和DSB。这些数字对您来说听起来准确吗?我似乎找不到官方资源进行比较。也许你可以为我指出正确的方向。

您不是在用您的方法测量延迟,而是在测量开销。

测量延迟的标准方法是使用指针追踪测试,初始化指针链以获得依赖访问,并控制它们的位置,以便它们适合(或不适合)指定大小的缓存。 其余过程相同,只是您不使任何内容无效。

像这样的东西(用于说明,未经测试)

// prepare a chain of N pointers in a buffer
// Assume unsigned int has the same size as a pointer
unsigned int Buffer[N] ;
// chain them, here in a simple direct fashion.  
// You can also use a randomized sequence if you work in main memory
for (i=1; i<N; i++) { Buffer[i] = (unsigned int) &(Buffer[i-1]) ; }
// close the chain
Buffer[0] = (unsigned int) &(Buffer[N-1]) ;
// measure M accesses
Start =  PMCCNTR() ;
p = &(Buffer[0]) ;
for (i=M; i>0; i--) {
  p = *p;
}
Stop = PMCCNTR();

由于测量开销和随机干扰,测量单个访问会受到不准确性的影响。您应该测量大量访问的时间,以获得能够更好地反映所需内容的摊销延迟。要测量平均访问时间,您还需要确保这些访问不是并行运行的(这将测量吞吐量,而不是延迟),因此添加一些虚假依赖项,例如将以前访问的字节的内容添加到下一个地址(在将所有这些字节初始化为零之后)。

另外,您

没有说您是如何使地址无效的,但我猜您也将其从 L2 中扔了出来,实际上只是在测量内存延迟。