我正在练习缓存,我偶然发现了这个问题:
考虑以下程序:
typedef struct
{
int val; // The value we care about
float alpha;
float beta;
float gamma;
double eta;
double teta;
} cell;
#define N 4096
#define STEPS 2
cell cvalues[N];
cell tcvalues[N];
int values[N];
int tvalues[N];
void jacobi1()
{
int i, k;
cell *ptr1, *ptr2, *tmp;
ptr1 = cvalues;
ptr2 = tcvalues;
for(k = 0; k < STEPS; k++)
{
for(i = 1; i < N-1; i++)
{
ptr2[i].val = (ptr1[i-1].val+ptr1[i].val+ptr1[i+1].val)/3;
}
tmp = ptr1;
ptr1 = ptr2;
ptr2 = tmp;
}
}
}
在所有问题中,假设全局变量在内存中彼此相邻分配(因此 &cvalues[N] == &tcvalues[0])并且全局数组的值不在缓存中。
您的答案不必非常准确(例如,1023 而不是 1024;答案 1K 就足够了)。
假设代码在具有 16K 直接映射一级数据缓存和 32 字节缓存行的机器上运行,那么在运行 jacobi1 期间发生的缓存未命中数是多少?
根据我的理解,直接缓存一次只能容纳一个缓存块。但是,
jacobil1
需要访问索引 x、x+1 和 x-1,它们是 3 个块,所以现在它的命中率为 1/3(2/3 未命中率)。我怀疑我的理解和执行是否正确,这就是我来这里寻求帮助的原因。