微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

了解 ARM Cortex-A53 上的 L1D_CACHE_REFILL 速率

如何解决了解 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 举报,一经查实,本站将立刻删除。