Caching 有人能确保我对D缓存的理解是准确的吗?

Caching 有人能确保我对D缓存的理解是准确的吗?,caching,architecture,Caching,Architecture,我正在研究一个问题(我将在这里稍微改变一下这个问题,因为我更感兴趣的是有人检查我的知识),它大致如下: 您有三个10x20二维数组A、B和C。它们都包含双精度浮点数。有一个D-cache,有2048行长,每行长256字节。这是按主要顺序排列的 然后,您会得到一些运行方式如下的代码: for(i = 0 to 9) for(j = 0 to 19) C[i][j] = A[i][j] + B[i][j] A位于地址0x10014000,B位于地址0x10019000,C位于地

我正在研究一个问题(我将在这里稍微改变一下这个问题,因为我更感兴趣的是有人检查我的知识),它大致如下:

您有三个10x20二维数组A、B和C。它们都包含双精度浮点数。有一个D-cache,有2048行长,每行长256字节。这是按主要顺序排列的

然后,您会得到一些运行方式如下的代码:

for(i = 0 to 9)
    for(j = 0 to 19)
      C[i][j] = A[i][j] + B[i][j]
A位于地址0x10014000,B位于地址0x10019000,C位于地址0x1001E000

这个问题询问读命中和写未命中

现在,据我所知,双精度浮点数是8字节长。由于每行长度为256字节,缓存的每行可以容纳32个值,对吗?由于它有2048行长,缓存可以保存65536个值。对吧?

A、 B、B和C中各有200个元素。这是否意味着在A和B的第一次读入之后,数组中的所有读数都将被读取?只有一次写未命中——当C没有第一次加载到D缓存时

这是准确的,还是我弄错了?这听起来不对,但我不知道我错过了什么。

这不是真的。在您的示例中,A和b的第一个“填充”仅填充一条缓存线,即矩阵A的0x10014000到0x100140ff。当需要0x10014100时,矩阵A中会再次发生缓存未命中

何况

现在,据我所知,双精度浮点数是8字节长。由于每行长度为256字节,缓存的每行可以容纳32个值,对吗?由于它有2048行长,缓存可以保存65536个值。对吧?

是的。但如果缓存容量大于内容,则不能断定不会出现缓存未命中,除非缓存是完全关联的。这就是所谓的“碰撞”。有一些关于缓存关联性的链接:

  • 这不是真的。在您的示例中,A和b的第一个“填充”仅填充一条缓存线,即矩阵A的0x10014000到0x100140ff。当需要0x10014100时,矩阵A中会再次发生缓存未命中

    何况

    现在,据我所知,双精度浮点数是8字节长。由于每行长度为256字节,缓存的每行可以容纳32个值,对吗?由于它有2048行长,缓存可以保存65536个值。对吧?

    是的。但如果缓存容量大于内容,则不能断定不会出现缓存未命中,除非缓存是完全关联的。这就是所谓的“碰撞”。有一些关于缓存关联性的链接: