我正在研究一个问题(我将在这里稍微改变一下这个问题,因为我对检查我的知识的人更感兴趣),这有点像:
你有三个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和C各有200个元素。这是否意味着在A和B的第一个读入之后的所有内容都会被读取命中?只有一次写入未命中 - 当C没有首次加载到D-cache中时?
这是准确的,还是我弄错了?这听起来不对,但我不知道我错过了什么。
答案 0 :(得分:0)
事实并非如此。在您的示例中,A和b的第一个“填充”仅填充一个高速缓存行,对于矩阵A,从0x10014000到0x100140ff。当需要0x10014100时,将再次在矩阵A中发生高速缓存未命中。
更多
现在,据我所知,双精度浮点数长度为8个字节。由于每行的长度为256字节,缓存的每一行可以容纳32个值,对吗?由于它的长度为2048行,因此缓存可以容纳65536个值。正确?
是对的。但是,如果缓存容量大于内容,则不能断定不存在缓存未命中,除非缓存是完全关联的。这被称为“碰撞”。有一些关于缓存关联性的链接: