因此,对于我的计算机体系结构类,我必须在C#上模拟缓存/内存关系,而我只是不确定缓存实际存储数据的方式。我得到了缓存标记的概念,但我真的没有得到偏移量。
所以说我有一个拥有256个32位整数的RAM。我想有一个缓存系统,我有一个缓存,可以容纳8个32位整数。但是在高速缓存中的那些32位整数中,我需要添加标记和有效位,这使得它的大小大致可以减少到26位左右。那么如何将32位数据存储在剩余的26位中呢?
以下是我现在的代码,它仍在进行中
class Memory
{
public List<UInt32> instructions = new List<UInt32>();
const int directCacheSize = 8;
ulong[] directCache = new ulong[directCacheSize];
private int[] stack = new int[256];
public int this[int i]
{
get
{
int directMapIndex = i % directCacheSize;
if (directCache[directMapIndex] == Convert.ToUInt64(stack[i]))
{
return Convert.ToInt32(directCache[directMapIndex] - 18446744069414584320);
}
else
{
directCache[directMapIndex] = (Convert.ToUInt64(i) << 32) + Convert.ToUInt64(stack[i]);
return stack[i];
}
}
set
{
stack[i] = value;
}
}
}
答案 0 :(得分:3)
我一直试图理解这个多为语无伦次的问题,我想我已经明白了。
我原本以为你的基本错误是从数据大小中减去用于维护缓存数据结构位的位;这没有任何意义。它们已添加到数据大小。
但后来我意识到不,你的基本错误是你把位与字节混淆了。您从字节中减去六个位到无意义地获得26,但您应将六位添加到32 x 8 位。
这简单令人困惑的错误是你似乎也把数据块中的偏移与数据块本身混淆了。数据块存储数据。 偏移量标识数据块中相关数据的位置。偏移量是有效地址的一部分,而不是缓存行!< / p>
你似乎也忘记了整个过程中的脏东西。
那么我的直接地图缓存中的单个块看起来像这样:[tag 5bit] [data 32bit]
没有。 32出现在这个问题上的次数让你深感困惑:
那是很多32岁的你并且非常困惑他们。
重新开始。
假设您想要一条包含8个32位字的单行,总共32个字节。什么必须在单个缓存行中?
如果我们假设32个字节只能在32字节边界上,并且有1024/32 = 32个这样的边界,那么对于标签我们需要log2(32)= 5位,所以总缓存行大小将是:
有意义吗?