【问题标题】:Measure cache access time/cycles for the ARM Cortex-A15测量 ARM Cortex-A15 的缓存访问时间/周期
【发布时间】:2013-11-05 12:52:04
【问题描述】:

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

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

缓存访问大约有 240 个周期,非缓存访问大约有 350 个周期。 我还使用了 ISB、DMB 和 DSB。这些数字听起来准确吗?我似乎无法找到可与之比较的官方资源。也许你能指出我正确的方向。

【问题讨论】:

    标签: c++ performance caching cpu-cache cortex-a


    【解决方案1】:

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

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

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

    // 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();
    

    【讨论】:

      【解决方案2】:

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

      另外,你没有说你是如何使地址无效的,但我猜你也把它扔出了 L2,实际上只是在测量内存延迟。

      【讨论】:

      • 对不起,应该在第一篇文章中说出来。我做了 >10000 次迭代,240/350 是我计算的平均值。我用“MCR p15, 0, %2, c7, c6, 1”(%2=address)使地址无效。你是对的,它使 L1&L2 无效,所以我测量内存访问(350)和 L1/L2 访问(240,这里我不无效)。
      • @MarkusBraun,您是在每次迭代中测量一次时间,还是在所有迭代中测量一次?
      • 所以您支付了测量开销,它没有摊销。这种开销可能很大 - 我不确定 PMCCNTR 是否正在序列化
      • 但是如果我只测量一次超过 10000 次迭代的时间,那会不会不太精确?您的意思是我应该:启动计时器,循环 1..10000,在循环内:无效和访问,停止计时器,然后将时间除以 10000 以获得单次访问的周期?但是在这 10000 次迭代中,可能会有上下文切换、中断……这不会篡改最终结果吗?
      • 一开始就使所有内容无效,然后访问它们(确保访问模式足够分散以避免相同缓存行的好处以及硬件预取)。 10k 次访问足够短,可能没有 ctxt 开关/中断 - 但通常在进行基准测试时,如果可以的话,最好禁用它们。
      猜你喜欢
      • 1970-01-01
      • 2015-12-11
      • 2011-04-12
      • 2013-02-10
      • 1970-01-01
      • 2019-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多