如果给我一个C程序,我如何计算未命中率?

问题描述 投票:0回答:0

我正在练习缓存,我偶然发现了这个问题:

考虑以下程序:

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 未命中率)。我怀疑我的理解和执行是否正确,这就是我来这里寻求帮助的原因。

c caching cpu-architecture
© www.soinside.com 2019 - 2024. All rights reserved.