【发布时间】:2014-11-04 09:47:46
【问题描述】:
我正在尝试了解高速缓存如何读取和写入。此外,我正在尝试确定命中率和未命中率。我一遍又一遍地尝试阅读教科书“计算机系统 - 程序员视角”,似乎无法掌握这个想法。也许有人可以帮助我理解这一点:
我正在使用具有 480 行和 640 列的二维数组。缓存是直接映射的,大小为 64 KB,包含 4 字节行。下面是C代码:
struct pixel {
char r;
char g;
char b;
char a;
};
struct pixel buffer[480][640];
register int i, j;
register char *cptr;
register int *iptr;
sizeof(char) == 1 (表示数组中的索引每个包含 4 个字节(如果我理解正确的话))。缓冲区从内存地址 0 开始,缓存最初是空的(冷缓存)。唯一的内存访问是对数组的条目。所有其他变量都存储在寄存器中。
for (j=0; j < 640; j++) {
for (i=0; i < 480; i++){
buffer[i][j].r = 0;
buffer[i][j].g = 0;
buffer[i][j].b = 0;
buffer[i][j].a = 0;
}
}
对于上面的代码,它正在将数组中的所有元素初始化为 0,所以它必须在写入。我可以看到这是不好的局部性,因为数组是逐列而不是逐行写入。不影响失手率吗?我正在尝试根据缓存大小确定此代码的未命中率。我认为未命中率是 100%,如果位置是逐行的,那么它将是 25%。但我并不完全了解缓存内存的工作原理,所以......谁能告诉我一些可以帮助我更好地理解这一点的事情?
【问题讨论】: