【问题标题】:Working with cache memory. Mapping techniques [closed]使用高速缓存。映射技术[关闭]
【发布时间】:2016-06-02 12:55:56
【问题描述】:

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

假设我有这样的代码

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 个块。我为每种映射技术找到了缓存的地址格式(标签|索引|偏移):直接、关联和设置关联,我需要根据该代码找到未命中缓存并计算访问时间以找到更好的映射技术。在这里我卡住了,因为我需要查看 RAM 的内容和缓存的内容。

【问题讨论】:

  • 我在这里没有看到任何关于虚拟地址的信息。高速缓存和虚拟寻址是独立的特性。其余的:没有足够的信息并且:问题是什么?
  • 给出我需要计算未命中缓存和访问内存所需时间的代码。
  • 这既不是编码,也不是咨询服务。见How to Ask
  • 给定此代码,您无法计算未命中缓存和访问内存的时间。
  • 为什么不呢?该代码在每次迭代时都会生成一个数字序列。

标签: c++ c caching computer-science


【解决方案1】:

您可以如下模拟缓存和内存的工作:

从一个 int(4 bytes) 数组 int a[16][64] 开始。现在,假设数组从内存位置0 开始。因此,通过拥有这样的数组,您可以看到所有行 a[0]、a[1]、...a[15] 各有 64 列。现在array a 是二维的,即数组的数组。另外,你可以看到每一行的所有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 个整数是完全空的。

现在在访问a[0][0] 时,缓存中会发生未命中,并且会从 RAM 中将一个块带入缓存。现在,如果您注意到在访问元素 a[0][k] (1

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

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

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

如果您理解这一点,那么访问时间也可以根据命中率和未命中率(或命中和未命中数)的多少来计算。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 2018-08-12
    • 2015-08-31
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多