了解 ARM Cortex-A53 上的 L1D_CACHE_REFILL 速率

问题描述

我正在使用 OProfile 来分析在 AArch64 状态下在 RaspBerry Pi 3 上运行的循环。循环很简单:

void add1(uint16_t* a,size_t array_size)
{
  for (int i = 0; i < array_size; i++)
  {
    a[i] = a[i] * 2;
  }
}

它产生如下汇编代码(带有 -O1 标志):

    add x2,x0,x3,lsl 1
.L3:
    ldrh    w0,[x1]
    ubfiz   w0,w0,1,15
    strh    w0,[x1],2
.LVL3:
    cmp x1,x2
    bne .L3

加载、修改和存储也很直接(为了简单起见,我省略了一些 prolog 和 epilog 代码,但它们仅用于设置堆栈和类似的东西)。

然后我开始尝试通过在记录一些 events of the CPU using OProfile 的同时更改数组大小。我目前很好奇(也不理解)的是 L1D_CACHE_REFILL 事件。我记录了一些数据,如下所示:

enter image description here

问题是:为什么(Array Size)/(Count of L1 Data Cache Refill)的比率是12(渐近),这意味着L1缓存每12个循环实例重新填充一行? AFAIK,Cortex-A53 上的 L1 缓存长度为 64B,这意味着每个缓存线最多可以容纳 32 个 16 位值。那么就是说每次L1行填充后,它的数据应该可以支持32个循环计算实例,对吗?这与处理器的缓存策略有关吗?如果有人可以对此有所了解,我将不胜感激。

注意:在图中有一些负值数据点,这些数据点基本上来自于通过去除程序其他部分的计数(去除 DC 值)来进行归一化。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)