【问题标题】:Direct Mapped Cache using Blocks使用块的直接映射缓存
【发布时间】:2012-04-11 14:27:49
【问题描述】:

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

我需要回答的问题是……

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

【问题讨论】:

    标签: caching hardware computer-architecture


    【解决方案1】:

    @shailesh 是对的,但要小心使用 reference 这个词。 reference 模式取决于程序。想象一下,我们编写一个 C 程序,它以 16 字节的步幅引用一个 char 数组。这是一个愚蠢的例程,基本上可以做到这一点:

    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] 之后,x[0]x[15] 将由于 16B 块大小而被带入缓存。但是下一个引用,即x[16]没有。换句话说,对于这里的缓存,此循环中的 每个 引用都会导致缓存未命中。

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

    【讨论】:

      【解决方案2】:

      是的,您的理解是正确的。当从内存中读取一个字节时,时间局部性表明接下来的几个字节也将被随后读取。因此缓存的块大小通常超过 1 个引用,在本例中为 4 个引用。在下一次内存访问期间,如果处理器请求下一个引用,它已经在缓存中!

      内存地址可以分为两部分:块地址和块偏移。块偏移将用于在缓存的同一块上的这些引用之间进行选择。另一部分,块地址进一步分为标签和索引字段。 index 字段用于选择访问哪个集合(在直接映射缓存的情况下,每个缓存块为 1 个集合)。 tag 字段从集合中选择缓存块。

      【讨论】:

        猜你喜欢
        • 2015-07-07
        • 2018-06-24
        • 1970-01-01
        • 2018-05-24
        • 2014-06-04
        • 2020-04-18
        • 2012-07-09
        • 2013-11-24
        相关资源
        最近更新 更多