我知道这是一个家庭作业问题,我不是要求答案。我想了解这个问题,随意使用其他例子来解释。
我需要回答的问题是......
Each reference is a read of a 4-byte integer value and is described by the byte
address of that integer.
Assuming a 1KB, 16B block, direct-mapped cache, initially empty, fill in whether
each reference is a hit or a miss.
我们得到一个4字节的引用列表。例如0x00000000,0x00000006,......
根据我的理解,有64个块(1024/16),每个块是16个字节。当它查看第一个引用时,它将是一个未命中,它会将其带入缓存。我知道它会引入缓存中的下一个引用,因为每个块将保存16个字节。这是否意味着,在未命中时,它会引入4个引用,因为每个引用是4个字节?
答案 0 :(得分:1)
是的,你所理解的是正确的。当从存储器读取字节时,时间局部性表明随后将读取接下来的几个字节。因此,缓存通常具有超过1个引用的块大小,在这种情况下为4个引用。在下一次内存访问期间,如果处理器请求下一个引用,它已经存在于缓存中!
存储器地址可以分为两部分:块地址和块偏移。块偏移量将用于在缓存的同一块上的这些引用之间进行选择。另一部分,块地址进一步分为标记和索引字段。索引字段用于选择要访问的集合(在直接映射缓存的情况下,每个缓存块为1集)。标记字段从集合中选择缓存块。
答案 1 :(得分:1)
@shailesh是对的,但要小心 reference 这个词。 参考模式取决于程序。想象一下我们编写一个引用16Byte步长中的char数组的C程序的情况。这是一个基本上会做的愚蠢的例行程序:
void foo (char * x, int MAX) {
int i;
char a;
for (i = 0; i < MAX; i += 16)
a = x[i];
}
假设x
位于地址0x00000000
。然后该循环将引用地址
0x00000000
,0x00000010
,0x00000020
,0x00000030
等。在这种情况下,在第一次引用x[0]
之后,由于16B块大小,x[0]
到x[15]
将被带入缓存。但下一个引用,即x[16]
没有。换句话说,对于此处的缓存,此循环中的每个引用都将导致缓存未命中。
您会发现,在优化性能时,考虑机器的缓存组织和行为将帮助您避免这种不良的内存访问模式。