作为一项学校作业,我需要找到一种方法来获取 L1 数据缓存行大小,而无需读取配置文件或使用 api 调用。应该使用内存访问读/写时序来分析和获取此信息。那么我该怎么做呢?
在对分配的另一部分进行的不完整尝试中,为了找到缓存的级别和大小,我有:
for (i = 0; i < steps; i++) {
arr[(i * 4) & lengthMod]++;
}
我在想也许我只需要改变第 2 行,(i * 4)
部分?所以一旦我超过缓存行大小,我可能需要更换它,这需要一些时间?但就这么简单吗?所需的块可能已经在内存中的某个地方?或者,我仍然可以指望这样一个事实,即如果我有足够大的steps
,它仍然会非常准确地工作?
更新
继承人在 GitHub 上的尝试 ......下面的主要部分
// repeatedly access/modify data, varying the STRIDE
for (int s = 4; s <= MAX_STRIDE/sizeof(int); s*=2) {
start = wall_clock_time();
for (unsigned int k = 0; k < REPS; k++) {
data[(k * s) & lengthMod]++;
}
end = wall_clock_time();
timeTaken = ((float)(end - start))/1000000000;
printf("%d, %1.2f \n", s * sizeof(int), timeTaken);
}
问题是时间之间似乎没有太大差异。供参考。因为它用于 L1 缓存。我有 SIZE = 32 K(数组大小)