【发布时间】:2012-09-22 09:49:37
【问题描述】:
作为一项学校作业,我需要找到一种方法来获取 L1 数据缓存行大小,而无需读取配置文件或使用 api 调用。应该使用内存访问读/写时序来分析和获取此信息。那么我该怎么做呢?
在对分配的另一部分进行的不完整尝试中,为了找到缓存的级别和大小,我有:
for (i = 0; i < steps; i++) {
arr[(i * 4) & lengthMod]++;
}
我在想也许我只需要改变第 2 行,(i * 4) 部分?所以一旦我超过缓存行大小,我可能需要更换它,这需要一些时间?但就这么简单吗?所需的块可能已经在内存中的某个地方?或者,如果我有足够大的steps,我仍然可以指望它仍然会非常准确地工作?
更新
Heres an attempt on 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(数组大小)
【问题讨论】:
-
添加了 C 标签 - @JiewMeng,也许你会确认你确实是用 C 写的。我已经删除了 homework 标签(根据meta.stackexchange.com/questions/147100/…)
-
@DanPuzey,是的,它的 C 或 C++ ...
-
谷歌“缓存基准测试”,做一些研究。
-
您可以使用汇编,然后使用 CPUID 指令(它是处理器指令,而不是 API)来获取此信息。我知道你可能不是在寻找这样的解决方案,但无论如何我认为值得分享......
-
This question 可能会给你一些想法。它不测量缓存大小,但确实显示每个缓存级别的性能显着下降。
标签: c++ c performance caching cpu-architecture