15

如何以编程方式测量(不查询操作系统)L1 和 L2 缓存(数据缓存)的大小和关联顺序?

关于系统的假设:

  • 它有 L1 和 L2 缓存(也可能是 L3,可能是缓存共享),
  • 它可能有一个硬件预取单元(就像 P4+),
  • 它有一个稳定的时钟源(tickcounter 或 gettimeofday 的良好 HPET)。

没有关于操作系统的假设(可以是 Linux、Windows 或其他),我们不能使用 POSIX 查询。

语言是 C,编译器优化可能被禁用。

4

4 回答 4

6

我认为您需要做的就是以不断增加的块重复访问内存(以确定缓存大小),并且我认为您可以改变步幅来确定关联性。

因此,您将开始尝试访问非常短的内存段并不断将大小加倍,直到访问速度变慢。每次访问速度变慢时,您就确定了另一级缓存的大小。

于 2010-04-05T04:21:22.580 回答
2

这是来自 ATLAS 的代码。它用于 L1 缓存大小

ATLAS/tune/sysinfo/L1CacheSize.c

https://github.com/vtjnash/atlas-3.10.0/blob/master/tune/sysinfo/L1CacheSize.c

int GetL1Size(int MaxSize, double tol)
{
int L1Size, tmp, correct=1;
fprintf(stderr, "\n Calculating L1 cache size:\n");

但它只是 l1 缓存,只有它的大小,而不是路数。

于 2010-04-05T16:12:55.700 回答
1

您可能会发现STREAM 基准测试有用或有趣,或两者兼而有之。

于 2010-04-05T16:22:18.097 回答
1

问题有点过时了,但答案就在这里

于 2010-08-15T15:03:09.830 回答