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

news/2024/9/15 9:28:43 标签: cache, mmu, armv8, armv9, 缓存

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


http://www.niftyadmin.cn/n/5066356.html

相关文章

CSS之linear-gradient( ) 函数—背景颜色渐变设计

目录 linear-gradient( ) 函数 简介: 语法: 详解: 例如: linear-gradient( ) 函数 简介: linear-gradient 函数是 CSS 中用于创建线性渐变的函数。它接受一个或多个参数,并使用这些参数创建一个渐变。…

QT 实现 TCP 客户端服务器代码

服务器 头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTcpServer> //服务器头文件 #include<QTcpSocket> //客户端头文件 #include<QList> //链表容器 #include<Q…

Docker快速搭建漏洞靶场指南

user: admin passwrod&#xff1a;password 查看容器是否已开启&#xff1a; 最常见漏洞&#xff1a; 防护级别提高后&#xff1a; 更改防护级别&#xff1a; 复现vulhub漏洞靶场&#xff1a; 开启&#xff1a; 一个是漏洞类型一个是真实的漏洞靶场。

线索二叉树的建立与遍历

#include<stdio.h> #include<stdlib.h> typedef char ElemType; typedef struct BiTNode {ElemType data;struct BiTNode* lchild, * rchild;int ltag, rtag; }ThreadNode,*ThreadTree; void InThread(ThreadTree &p, ThreadTree &pre) {//二叉树线索化 if…

使用Pytorch构建神经网络

构建神经网络的典型流程 定义一个拥有可学习参数的神经网络遍历训练数据集处理输入数据使其流经神经网络计算损失值将网络参数的梯度进行反向传播以一定的规则更新网络的权重 我们首先定义一个Pytorch实现的神经网络: # 导入若干工具包 import torch import torch.nn as nn …

堆排序——向下调整

之前我们要想实现堆排序&#xff0c;是运用建堆代码来实现的&#xff1a; 向上调整建堆——向下调整排序 那么去我们可不可以只适用一种调整方法&#xff08;向下调整&#xff09;就能实现这样的功能呢&#xff1f; 向要只使用向下调整就实现堆排序 首先就是把数组里的值使用…

python机器学习基础教程02-鸢尾花分类

初识数据 from sklearn.datasets import load_irisif __name__ __main__:iris_dataset load_iris()print("数据集的键为:\n{}".format(iris_dataset.keys()))# DESCR 数据集的简要说明print(iris_dataset[DESCR][:193])# target_names 数组对应的是我们要预测的花…

【Pytorch笔记】5.DataLoader、Dataset、自定义Dataset

参考 深度之眼官方账号 - 02-01 Dataloader与Dataset.mp4 torch.utils.data.DataLoader 功能&#xff1a;构建可迭代的数据装载器。 data.DataLoader(dataset,batch_size1,shuffleFalse,samplerNone,batch_samplerNone,num_workers0,collate_fnNone,pin_memoryFalse,drop_la…