memset会导致一大块内存进cache吗?

电子说

1.2w人已加入

描述

在 Arm 体系结构中,我们知道大多数的 normal memory 的配置都是 write allocation 和 read allocation 的,即当写一块内存或读一块内存的时候,如果 miss 了,那么会将该物理内存缓存到 cache 中。

那么就带来一个这样的思考,如果我执行 memset(a, b, len),len 是一个很大的数,即对一大块内存清 0,那么这一大块内存数据 (此时都是 0 的数据) 都需要被缓存到 cache 吗?这岂不是造成 cache 的浪费?一下就把 cache 占满了?

在之前的微架构,也许是真的存在此问题的。然后在近些年的微架构中,可通过 “Write streaming mode” 解决。具体介绍如下,我们就以 Cortex-A720 为例,进一步说明。

Cortex-A720 核心支持 Write streaming mode,有时也称为读分配模式,对于 L1 和 L2 缓存都支持。

在读不命中或写不命中时,会向 L1 或 L2 缓存分配缓存行。然而,写入大块数据可能会使缓存中充满不必要的数据。这不仅会浪费电力,也会降低性能,因为整个线路会被后续写入覆盖(例如使用 memset() 或 memcpy())。

在某些情况下,不需要在写入时分配缓存行。例如,当执行 C 标准库的 memset() 函数来将大块内存清零为已知值时。

为了防止不必要的缓存行分配,内存系统会检测 core 何时写入了一系列完整的缓存行。如果在可配置数量的连续线路填充上检测到这种情况,那么它会切换到写入流模式。

在写入流模式下,加载操作行为与正常情况相同,仍然可能引起线路填充。
写入仍然在缓存中查找,但如果未命中,则会写入 L2 或 L3 缓存,而不会启动线路填充 L1。

在内存系统切换到写入流模式之前,CHI 主控器或 AXI 主控器接口可能会观察到超过指定数量的线路填充。

写入流模式保持启用,直到以下情况之一发生:

检测到一个不是完整缓存行的可缓存写入突发。

存在后续加载操作,其目标与未完成的写入流相同。

当 Cortex-A720 核心切换到写入流模式后,内存系统会继续监视总线流量。当它观察到一系列完整的缓存行写入时,会向 L2 或 L3 缓存发出信号,以进入写入流模式。

写入流阈值定义了在存储操作停止引起缓存分配之前,连续写入的缓存行数量。您可以通过写入寄存器 IMP_CPUECTLR_EL1 来配置每个缓存(L1、L2 和 L3)的写入流阈值。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分