0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

冬至子 来源:Arm精选 作者:baron 2023-11-07 16:00 次阅读

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

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

    关注

    30

    文章

    5028

    浏览量

    117723
  • Cache
    +关注

    关注

    0

    文章

    127

    浏览量

    27981
  • Cortex-A7
    +关注

    关注

    0

    文章

    33

    浏览量

    16324
收藏 人收藏

    评论

    相关推荐

    C语言内存知识总结:memset函数和calloc函数

    memset(翻译:清零)是计算机中C/C++语言初始化函数。作用是将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作。
    发表于 10-24 10:40 872次阅读

    STM32h7开启Cache后,串口发送DMA导致中断触发如何解决?

    STM32h7 开启Cache后,串口使用发送DMA发送数据导致中断触发(只开启接收空闲中断),接收和发送的缓存指定在手动分配的内存区域(此区域通过MPU配置,关闭了
    发表于 03-12 07:37

    Memset、Memcpy、Strcpy 的作用和区别(转)

    count个字节设置成字符 c。说明: 返回指向buffer的指针。用来对内存空间全部设置为某个字符例如:char a[10]; memset(a, '\0', sizeof(a)); m
    发表于 01-19 11:57

    FPGA 开发板上几个裸露焊盘的疑惑

    ``大家好: 下图是我从我的开发板上拍下来的。红框的背面是一块DDR,红框中有很多的小圆形焊盘。这是做什么用的?做测试点?然后下面一大块是FPGA的背面,同样有很多小圆形焊盘。还请哪位大神讲讲是干什么用的。谢啦。``
    发表于 11-11 10:16

    altium 画PCB敷铜时有类似孤铜要怎么处理

    `用altium 画PCB敷铜时有类似孤铜的铜箔,不知道该剔除还是保留,保留的话看上去就有点别扭,去除呢有感觉空出一大块怪怪的。想问下像这种情况般要怎么处理比较好?这样铺铜对电器性能有什么影响?`
    发表于 01-06 20:32

    AD 如何挖空Solid Region

    我用的AD17,用place-solid Region花了一大块铜皮连接电源网络,直接覆盖了几个电容的焊盘,现在想把这些电容的焊盘做成热焊盘的样子,要不然焊接的时候散热太快,但是没有办法用keep out和pour cutout来做挖空区域。请教下熟练的兄弟有什么办法吗?
    发表于 07-24 17:33

    嵌入式中ARM的MMU和Cache机制

    Cache通过预测CPU即将要访问的内存地址(般都是顺序的),预先读取大块内存供CPU访问,来减少后续的
    发表于 08-19 22:42

    新人求教|ad pcb辅铜问题

    如图所示怎么把绿色的圈圈内的线也起辅铜?就是两个元件之间用一大块辅铜
    发表于 05-05 09:00

    18F24K22查找表不工作怎么办

    亲爱的朋友们,我试着用个大约700字节的数据填充一大块内存。这是给18F43K22的。我试图用“db”指令来处理这个问题。但是如果最后个地址是奇数的话,它会增加0。我只能做每行两个
    发表于 05-14 14:24

    什么是Instructions Cache/IMM/ID

    什么是Instructions Cache/IMM/ID  Instructions Cache: (指令缓存)由于系统主内存的速度较慢,当CPU读取指令的时候,会导致CP
    发表于 02-04 11:51 585次阅读

    iOS10.3救不了小内存,iPhone6 32G帮你解决

    最近大火的 iOS 10.3 ,其中让果粉们最看中的就是苹果最新的APFS文件系统,它能让储存空间腾出一大块地方,简直是小内存用户的福音啊!
    发表于 04-19 09:57 1.9w次阅读

    基于内存云的大块数据对象并行存取策略

    了基于内存云的大块数据对象并行存取策略。该存储策略首先将大块数据对象分割成若干个1 MB的小块数据对象,然后在客户端生成数据摘要,最后使用并行存储算法将客户端分割成的小块数据对象存储在内存
    发表于 12-17 11:02 0次下载
    基于<b class='flag-5'>内存</b>云的<b class='flag-5'>大块</b>数据对象并行存取策略

    memset函数和calloc函数

    每种类型的变量都有各自的初始化方法,memset() 函数可以说是初始化内存的“万能函数”,通常为新申请的内存进行初始化工作。它是直接操作内存空间,mem即“
    的头像 发表于 10-20 16:13 1894次阅读

    什么是 Cache? Cache读写原理

    由于写入数据和读取指令分别通过 D-Cache 和 I-Cache,所以需要同步 D-Cache 和 I-Cache,即复制后需要先将 D-Cach
    发表于 12-06 09:55 1267次阅读

    内存池的使用场景

    的屎山中,非常容易出现内存泄漏导致mmo的问题。 为了解决这两个问题,内存池就应运而生了。内存池预先分配一大块
    的头像 发表于 11-10 17:19 342次阅读
    <b class='flag-5'>内存</b>池的使用场景