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

在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)的写入流阈值。

相关推荐
短剑重铸之日10 分钟前
《7天学会Redis》Day 5 - Redis Cluster集群架构
数据库·redis·后端·缓存·架构·cluster
胡萝卜的兔4 小时前
ThinkPHP6.0 Redis 延迟队列 + 定时任务 实现超时取消订单完整部署脚本
数据库·redis·缓存
进阶的小名5 小时前
[超轻量级延时队列(MQ)] Redis 不只是缓存:我用 Redis Stream 实现了一个延时MQ(自定义注解方式)
java·数据库·spring boot·redis·缓存·消息队列·个人开发
短剑重铸之日5 小时前
《7天学会Redis》Day 6 - 内存&性能调优
java·数据库·redis·缓存·7天学会redis
a努力。6 小时前
字节跳动Java面试被问:一致性哈希的虚拟节点和数据迁移
java·开发语言·分布式·算法·缓存·面试·哈希算法
VT.馒头6 小时前
【力扣】2622. 有时间限制的缓存
javascript·算法·leetcode·缓存·typescript
短剑重铸之日6 小时前
《7天学会Redis》Day 3 - 持久化机制深度解析
java·redis·后端·缓存
qq_435139576 小时前
多级缓存(Caffeine+Redis)技术实现文档
数据库·redis·缓存
am心8 小时前
学习笔记-缓存&添加购物车
笔记·学习·缓存
Codeking__8 小时前
Redis初识——Redis的基本特性
数据库·redis·缓存