使用块直接映射缓存

时间:2012-03-28 01:32:28

标签: caching hardware computer-architecture

我知道这是一个家庭作业问题,我不是要求答案。我想了解这个问题,随意使用其他例子来解释。

我需要回答的问题是......

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个字节?

2 个答案:

答案 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。然后该循环将引用地址 0x000000000x000000100x000000200x00000030等。在这种情况下,在第一次引用x[0]之后,由于16B块大小,x[0]x[15]将被带入缓存。但下一个引用,即x[16] 没有。换句话说,对于此处的缓存,此循环中的每个引用都将导致缓存未命中。

您会发现,在优化性能时,考虑机器的缓存组织和行为将帮助您避免这种不良的内存访问模式。