【发布时间】:2019-07-04 01:27:16
【问题描述】:
我正在阅读 Bryant & O'Hallaron 的《计算机系统》一书,有一个练习,其解决方案似乎不正确。所以我想确定一下
给定
struct point {
int x;
int y; };
struct array[32][32];
for(i = 31; i >= 0; i--) {
for(j = 31; j >= 0; j--) {
sum_x += array[j][i].x;
sum_y += array[j][i].y; }}
sizeof(int) = 4;
我们有 4096 字节的缓存,块(行)大小为 32 字节。 询问命中率。
我的推理是,我们有 4096/32 = 128 块,每个块可以存储 4 个点(2*4*4 = 32),因此缓存可以存储数组的 1/2,即 512 个点(总共 32*32 = 1024)。由于代码以列主要顺序访问数组,因此对每个点的访问都失败了。所以我们有array[j][i].x 总是错过,而array[j][i].y 被击中。最后未命中率 = 命中率 = 1/2。
问题:解决方案说命中率为3/4,因为缓存可以存储整个数组。
但根据我的推理,缓存只能存储半个点
我错过了什么吗?
【问题讨论】:
-
sizeof(int) = 4;
-
你说得对,存储顺序是这样的。因此,通过读取
point[j][i].x,point[j][i].y由于空间局部性而存储在缓存中(在我们的例子中,点 = 数组) -
例如通过访问
array[0][0].x,我们将array[0][0].y、array[0][1].x、array[0][1].y、...、array[0][3].xarray[0][3].y加载到第一个块中 -
@thb 我在等。顺便说一句,在我看来,很明显缓存不能存储整个数组,而解决方案说它可以
标签: c caching cpu-architecture