caching - 直接映射缓存如何实现空间局部性?
问题描述
数组被声明为 floatA[2048] 。每个数组元素的大小为 4 字节。该程序在具有 8 字节大小的直接映射数据缓存的计算机上运行,块(行)大小为 16 字节。数组的哪些元素与数据缓存中的元素 A[0] 冲突?
最终 A[0],A[512],A[1024],A[1536] 映射到缓存块 0
根据我的理解,当第一次需要 A[0] 时,A[0],A[1],A[2],A[3](因为一个缓存块可以容纳 4 个元素)被带入缓存并分别放置在缓存块 0、1、2 和 3 中。
其他方法是只带 A[0] 并将其放在缓存块 0 中。(此处未使用空间局部性)
在这种情况下,一般做法是什么?
解决方案
所有四个元素 A[3:0] 都存储在缓存块 0 中 - 因为这 4 个元素一起形成 16B。根据硬件系统的设置方式,接下来的 16B 将存储在缓存块 1 中(在设计硬件时决定将哪个缓存行(16B 连续数据颗粒)映射到哪个集合,并且基于缓存块的某些位)地址。
推荐阅读
- java - Error while trying to write some data on a MySQL empty table with 5.7 version
- java - 在 Spring boot 2 @Service 和它使用的 Business Objects / POJO 中使用 Locale(从网页或 REST 服务知道)的方式是什么?
- windows - Windows directory with 5 million files
- c# - Get Active Directory ExtensionAttribute via UserPrincipal
- python - PySide: QAbstractItemModel - connect dataChanged()
- powerbi - 忽略事实表中的空白测量 dax
- r - 有没有办法“分块”德雷克输出来加速计划验证和显示?
- javascript - React Redux 无限循环更新 - 使用 combineReducers 更新启动问题
- swift - PromiseKit 6 错误无法转换错误
- java - Kotlin Android / Java String DateTime 格式,API21