使用缓存。映射技术

时间:2016-06-02 12:55:57

标签: c++ c caching computer-science

我正在我的大学攻读计算机架构课程。我对缓存映射主题有点问题。

我们说我有这样的代码

for (int i=0;i<8;i++)
for (int j=0;j<256;j++)
    a[i*1024+j] = i+j

我的RAM大小为64kb,高速缓存大小为2kb,块大小为256b。 第一步是找到我在缓存和RAM中有多少块。经过计算,我在RAM中获得256个块,在缓存中获得8个块。我发现每种映射技术的高速缓存格式(Tag | Index | Offset):直接,关联和组关联,我需要根据该代码找到未命中高速缓存并计算访问时间以找到更好的映射技术。在这里,我被困了,因为我需要看看RAM的内容和缓存的内容。

1 个答案:

答案 0 :(得分:1)

您可以按如下方式模拟缓存和RAM的工作:

首先使用int(4字节)数组int a[16][64]。现在,假设该数组从内存位置0开始。因此,通过使用这样的数组,您可以看到所有行a [0],a [1],... a [15]每个都有64列。现在array a是2D,即数组数组。此外,您可以看到每行的所有64个元素都可以直接放在256(64 * sizeof(int))的块中。

for(i = 0; i < 16; ++i)
    for(j = 0; j < 64; ++j)
        a[i][j] = i+j;

现在在上面的代码中,您试图以行方式访问数组元素 从上到下的方式。现在假设数组在RAM中,并且你的缓存有8个块,可以容纳64个int,它是完全空的。

现在,在访问a[0][0]时,将在缓存中发生未命中,并且将一个块从RAM引入缓存。现在,如果您注意到在访问元素a [0] [k](1&lt; = k&lt; = 63)时不会发生未命中,因为所有元素都可以从缓存中提供。

现在再次访问a[1][0]时,将发生未命中,相应的块将从RAM进入缓存等等。

在访问[8] [0]时,您会发现未命中并且缓存已满,现在需要用RAM中的新块替换某些块(替换算法将取决于缓存映射方法,即使用)。

通过这种方式,您可以模拟不同缓存映射技术的命中和未命中。

如果您了解这一点,那么也可以根据命中率和未命中率(或命中和未命中数)来找到访问时间。