陆续写些关于新书《自己动手写CPU》的博客,本篇主要是讲解 gem5验证数组的缓存优化
软件优化是提高cache命中率的十分有效的手段,cache的基本原理是利用程序局部性,而软件优化可以通过提高程序局部性,从而提高cache命中率。举一个例子如下:
程序A:
#include <stdio.h>
int main()
{
int i=0,j=0;
long count=0;
long temp[51200][8];
for(i=0;i<51200;i++)
for(j=0;j<8;j++)
{
temp[i][j]=i*j; // 大约51200 次DCache缺失
}
}
在C语言中,二维数组在内存中是按照行的次序在按照列的次序存放,也就是说,二维数组中同一行的数据在内存中是挨着的,但同一列的数据在内存中是分散的。
假设数据cache的line size是64,long类型是8个字节,那么在程序A中,temp[i][0]-temp[i][7]刚好是64字节,占用数据cache的一个line,所以在写temp[i][0]将发生一次cache缺失,在写temp[i][1]-temp[i][7]的时候,不会发生数据缺失,所以,一共发生51200次缺失。
程序B:
#include <stdio.h>
int main()
{