4-way 4-sets 缓存初始化

以下是 4-way 4-sets 缓存 的初始化代码实现,以及相关的结构和注释。


数据结构设计

缓存配置说明

  • 4 sets: 表示有 4 个集合,每个集合可以存储多个缓存行。
  • 4-way: 表示每个集合中有 4 个缓存行(组相联)。

每个缓存行需要包含以下字段:

  1. Valid 位:表示缓存行是否有效。
  2. Modified 位:表示缓存行是否被修改(脏位)。
  3. Tag:表示该缓存行的标记。
  4. 数据字段:存储缓存行中的实际数据。

C语言代码

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stdint.h>// 定义缓存行结构
typedef struct {bool valid;          // Valid bitbool modified;       // Modified/Dirty bituint32_t tag;        // Taguint8_t *data;       // Pointer to actual data
} CacheLine;// 定义缓存集合结构
typedef struct {CacheLine lines[4];  // 每个集合包含 4 个缓存行(4-way)
} CacheSet;// 定义整个缓存结构
typedef struct {CacheSet sets[4];    // 缓存包含 4 个集合
} Cache;// 初始化缓存
void initializeCache(Cache *cache, uint32_t lineSize) {for (int set = 0; set < 4; set++) {         // 遍历每个集合for (int way = 0; way < 4; way++) {    // 遍历集合中的每个缓存行cache->sets[set].lines[way].valid = false;      // 初始状态无效cache->sets[set].lines[way].modified = false;   // 初始状态未修改cache->sets[set].lines[way].tag = 0;            // 初始Tag为0cache->sets[set].lines[way].data = calloc(lineSize, sizeof(uint8_t)); // 分配缓存行数据}}
}// 打印缓存状态
void printCacheState(Cache *cache, uint32_t lineSize) {for (int set = 0; set < 4; set++) {printf("Set %d:\n", set);for (int way = 0; way < 4; way++) {CacheLine *line = &cache->sets[set].lines[way];printf("  Way %d -> Valid: %d, Modified: %d, Tag: 0x%X, Data: ",way, line->valid, line->modified, line->tag);for (int i = 0; i < lineSize; i++) {printf("%02X ", line->data[i]);}printf("\n");}}
}// 释放缓存
void freeCache(Cache *cache) {for (int set = 0; set < 4; set++) {for (int way = 0; way < 4; way++) {free(cache->sets[set].lines[way].data); // 释放每个缓存行的数据指针}}
}int main() {Cache cache;           // 创建缓存uint32_t lineSize = 16; // 每个缓存行的大小(字节)initializeCache(&cache, lineSize); // 初始化缓存printCacheState(&cache, lineSize); // 打印缓存状态freeCache(&cache);     // 释放缓存return 0;
}

代码解析

  1. 缓存行结构 (CacheLine)

    • 包含 valid 位、modified 位、tag 和一个指向数据的指针 data
    • data 使用 calloc 动态分配,初始化为 0。
  2. 缓存集合结构 (CacheSet)

    • 每个集合包含 4 个缓存行,表示 4-way。
  3. 整个缓存 (Cache)

    • 包含 4 个集合,每个集合是 4-way。
  4. 初始化函数 (initializeCache)

    • 遍历所有集合和缓存行,设置默认值(valid 和 modified 为 false,tag 为 0,数据初始化为 0)。
  5. 打印函数 (printCacheState)

    • 遍历缓存的每个集合和缓存行,打印出当前的 valid、modified、tag 和数据内容。
  6. 释放缓存 (freeCache)

    • 释放动态分配的 data 内存。

输出示例

假设每个缓存行大小为 16 字节,运行后初始状态为:

Set 0:Way 0 -> Valid: 0, Modified: 0, Tag: 0x0, Data: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00Way 1 -> Valid: 0, Modified: 0, Tag: 0x0, Data: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00Way 2 -> Valid: 0, Modified: 0, Tag: 0x0, Data: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00Way 3 -> Valid: 0, Modified: 0, Tag: 0x0, Data: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Set 1:...

总结

该实现展示了如何初始化 4-way 4-sets 缓存,包括每个缓存行的基本字段(valid, modified, tag, data)。通过动态内存分配和结构化设计,这种方式非常适合模拟实际的缓存行为。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/18525.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【ASR技术】WhisperX安装使用

介绍 WhisperX 是一个开源的自动语音识别&#xff08;ASR&#xff09;项目&#xff0c;由 m-bain 开发。该项目基于 OpenAI 的 Whisper 模型&#xff0c;通过引入批量推理、强制音素对齐和语音活动检测等技术。提供快速自动语音识别&#xff08;large-v2 为 70 倍实时&#xf…

【C++ 算法进阶】算法提升十六

目录 背包问题变种 &#xff08;动态规划&#xff09;题目题目分析 连续可组成数字题目题目分析 min-patches题目 最小补丁问题题目分析代码 逆序对个数 &#xff08;归并排序&#xff09;题目题目分析 约瑟夫环问题 &#xff08;公式&#xff09;题目题目分析 背包问题变种 &a…

链表的基本操作

链表&#xff0c;由若干个结点组成&#xff0c;每个结点包含数据域和指针域。结点结构如下图所示&#xff1a; 一般来讲&#xff0c;链表中只会有一个结点的指针域为空&#xff0c;该结点为尾结点&#xff0c;其他结点的指针域都会存储一个结点的内存地址。链表中也只会有一个结…

C#高级:Winform中的自定义窗体输入

目录 一、多样式输入&#xff08;无封装&#xff09; 1.代码 2.效果 二、单输入框封装 1.使用 2.封装 3.效果 三、组合框批量输入封装 1.使用 2.封装 3.效果 一、多样式输入&#xff08;无封装&#xff09; 1.代码 private async void button1_Click(object send…

memblock内存分配器

一、简述 memblock 是 Linux 内核中的一个内存管理子系统&#xff0c;主要用于在系统启动早期阶段管理物理内存。它在内核初始化期间负责管理内存&#xff0c;直到更复杂的内存管理子系统&#xff08;如伙伴系统&#xff09;接管。 二、工作原理 初始化&#xff1a;在内核启…

【C++滑动窗口】1248. 统计「优美子数组」|1623

本文涉及的基础知识点 C算法&#xff1a;滑动窗口及双指针总结 LeetCode1248. 统计「优美子数组」 给你一个整数数组 nums 和一个整数 k。如果某个连续子数组中恰好有 k 个奇数数字&#xff0c;我们就认为这个子数组是「优美子数组」。 请返回这个数组中 「优美子数组」 的数…

⽂件内容的读写

文件 InputStream &#xff08;字节流读出 抽象类&#xff09; InputStream 只是⼀个抽象类&#xff0c;要使⽤还需要具体的实现类 FileInputStream&#xff08;字节流读出&#xff09; OutputStream&#xff08;字节流写入&#xff09; Reader&#xff08;字符流读入&#xff…

FreeRTOS消息队列实验与出现的问题

目录 实验名字&#xff1a;队列操作实验 1、实验目的 2、实验设计 3、实验工程 4、实验程序与分析 ●任务设置 ● 其他应用函数 ● main()函数 ● 任务函数 ●中断初始化及处理过程 5.程序运行结果分析 6.进行实验移植时所遇到的问题 1.项目中mymalloc等函数缺少 …

el-cascader 使用笔记

1.效果 2.官网 https://element.eleme.cn/#/zh-CN/component/cascader 3.动态加载&#xff08;官网&#xff09; <el-cascader :props"props"></el-cascader><script>let id 0;export default {data() {return {props: {lazy: true,lazyLoad (…

Linux之进程概念(2)

Linux之进程概念&#xff08;2&#xff09; 孤儿进程 父进程如果提前退出&#xff0c;那么子进程后退出&#xff0c;进入Z之后&#xff0c;那该如何处理呢&#xff1f; 父进程先退出&#xff0c;子进程就称之为“孤儿进程” 孤儿进程被1号init进程领养&#xff0c;当然要有in…

1+X应急响应(网络)日志分析:

日志分析&#xff1a; Web日志分析&#xff1a; http协议&#xff1a; http版本演变&#xff1a; http协议工作原理&#xff1a; http协议的特点&#xff1a; http请求报文&#xff1a; http请求方法&#xff1a; http响应报文&#xff1a; UserId&#xff1a;注册网站的序列号…

go-zero(二) api语法和goctl应用

go-zero api语法和goctl应用 在实际开发中&#xff0c;我们更倾向于使用 goctl 来快速生成代码。 goctl 可以根据 api快速生成代码模板&#xff0c;包括模型、逻辑、处理器、路由等&#xff0c;大幅提高开发效率。 一、构建api demo 现在我们通过 goctl 创建一个最小化的 HT…

计算机编程中的设计模式及其在简化复杂系统设计中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 计算机编程中的设计模式及其在简化复杂系统设计中的应用 计算机编程中的设计模式及其在简化复杂系统设计中的应用 计算机编程中的…

latex中,两个相邻的表格,怎样留一定的空白

目录 问题描述 问题解决 问题描述 在使用latex写论文时&#xff0c;经常表格需要置顶写&#xff0c;则会出现两个表格连在一起的情况。下一个表名容易与上面的横线相连&#xff0c;如何通过明令&#xff0c;留出一定的空白。 问题解决 在第二个表格的 \centering命令之后…

leetcode01——合并两个有序数组

0.本题学到的知识 1.python的操作中&#xff0c;哪些是在原数据上进行操作的&#xff1f; 新开辟的行为&#xff1a;list1list1[m:n] 原数据&#xff1a;list1[a:b]list1[m:n] 新开辟&#xff1a;list1list1list2 原数据&#xff1a;list1.append(list2[i]); list1.extend(list…

深度学习的艺术:揭秘卷积神经网络(CNN)的神秘面纱

深度学习的艺术&#xff1a;揭秘卷积神经网络&#xff08;CNN&#xff09;的神秘面纱 一、CNN的构成要素二、CNN的工作流程三、CNN的应用领域四、CNN的优势与局限 #引言&#xff1a; 在人工智能的璀璨星空中&#xff0c;卷积神经网络&#xff08;CNN&#xff09;如同一颗耀眼的…

Linux高阶——1116—环形队列生产者消费者

目录 1、环形队列 2、生产者消费者 环形队列数组实现代码 成功截图 1、环形队列 相比于线性队列&#xff0c;环形队列可以有效避免访问越界问题&#xff0c;使用下标访问队列元素时&#xff0c;到达末尾后下标归0&#xff0c;返回起始位置&#xff0c;使用下标运算即可 a…

学习大数据DAY61 宽表加工

目录 模型设计 加工宽表 任务调度&#xff1a; 大表 - 把很多数据整合起来 方便后续的明细查询和指标计算 模型设计 设计 建模 设计: excel 文档去编写 建模: 使用建模工具 PowerDesigner Navicat 在线画图工具... 把表结构给绘 制出来 共享\项目课工具\pd 加工宽表 数…

DBeaver MACOS 安装 并连接到docker安装的mysql

官网下载&#xff1a;Download | DBeaver Community 网盘下载&#xff1a;链接: https://pan.baidu.com/s/15fAhbflHO-AGc-uAnc3Rjw?pwdbrz9 提取码: brz9 下载驱动 连接测试 报错 null, message from server: "Host 172.17.0.1 is not allowed to connect to this M…

24首届数证杯(流量分析部分)

目录 流量分析 流量分析 1、分析网络流量包检材&#xff0c;写出抓取该流量包时所花费的秒数?(填写数字&#xff0c;答案格式:10) 3504相加即可 2、分析网络流量包检材&#xff0c;抓取该流量包时使用计算机操作系统的build版本是多少? 23F793、分析网络流量包检材&#x…