进行求和 代码段A for(i=0;i<1024;i++) for(j=0;j<4;j++) sum += x[i][j] Entry 0 Way 0 x[i][0] x[i][1] x[i][2] x[i][3] 代码段B for(j=0;j<4;j++) for(i=0;i<1024;i++) sum += x[i][j] Way 1 x[i+2][0] Entry 1 x[i+2][1] x[i+2][2] x[i+2][3] Way 0 x[i+1][0] x[i+1][1] x[i+1][2] x[i+1][3] Way 1 x[i+3][0] x[i+3][1] x[i+3][2] x[i+3][3] 代码段A: 对于数组元素x[i][0](i=0…1024)的访问是miss的,但对于 x[i][1], x[i][2], x[i][3]的访问是hit的,因此miss的总次数为 1024次。 代码段B: 对于数组元素x[i][0], x[i][1], x[i][2], x[i][3] (i=0…1024) 的访问都是miss的,他们被x[i+4][0] , x[i+4][1], x[i+4][2], x[i+4][3]所替换,因此miss的总次数为4096次。 ? 当需要对大量数据访问的时候,一定要注意对内存的访问 要尽量是连续而且循环内层的访问接近cache的块大小, 以提高cache的命中率,从而提高程序的运行效率。 Cache的一致性问题 ? 在采用cache的系统中,同样一个数据可能既存在于cache 中,也存在于主存中,两者数据相同则具有一致性,数据 不相同就叫做不一致。 ? Cache主要有两种写策略写直达法(write through)和写回 法(write back) ? 写直达法(write through) 方法:在对cache进行写操作的同时,也将内容写到主存中。 优点:可靠性较高,操作过程比较简单。 缺点:写操作速度得不到改善,与写主存的速度相同。 ? 写回法(write back) 方法:在CPU执行写操作时,只写入cache,不写入主存。 优点:速度较高。 缺点:可靠性较差,控制操作比较复杂。 ? 对于多个主设备的共享存储总线系统,如带有DMA的 系统,或者多处理器系统,由于其他的主设备也可以 改变主存的内容,而这种改变是cache无法得知的,因 此必须对cache的一致性问题进行处理。 ? 可以将主存中的一块地址空间设置为非cache访问,CPU对 这部分地址空间进行直接访问,不经过cache处理,对这 部分地址空间的访问的效率会变低。 ? 如果要保证更改的数据写入存储器中,则选择WRITETHROUGH方式或者使用FLUSH指令,将cache内容刷新到主 存中。 ? 如果要保证读出的内容就是主存中的内容,则在读之前, 先将存储此数据的cache line无效,即运行INVALID指令。