首页 > 解决方案 > 直接映射缓存如何实现空间局部性?

问题描述

数组被声明为 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 中。(此处未使用空间局部性)

在这种情况下,一般做法是什么?

标签: cachingmemory-management

解决方案


所有四个元素 A[3:0] 都存储在缓存块 0 中 - 因为这 4 个元素一起形成 16B。根据硬件系统的设置方式,接下来的 16B 将存储在缓存块 1 中(在设计硬件时决定将哪个缓存行(16B 连续数据颗粒)映射到哪个集合,并且基于缓存块的某些位)地址。


推荐阅读