如何以编程方式测量(不查询操作系统)L1 和 L2 缓存(数据缓存)的大小和关联顺序?
关于系统的假设:
- 它有 L1 和 L2 缓存(也可能是 L3,可能是缓存共享),
- 它可能有一个硬件预取单元(就像 P4+),
- 它有一个稳定的时钟源(tickcounter 或 gettimeofday 的良好 HPET)。
没有关于操作系统的假设(可以是 Linux、Windows 或其他),我们不能使用 POSIX 查询。
语言是 C,编译器优化可能被禁用。
我认为您需要做的就是以不断增加的块重复访问内存(以确定缓存大小),并且我认为您可以改变步幅来确定关联性。
因此,您将开始尝试访问非常短的内存段并不断将大小加倍,直到访问速度变慢。每次访问速度变慢时,您就确定了另一级缓存的大小。
这是来自 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 缓存,只有它的大小,而不是路数。
您可能会发现STREAM 基准测试有用或有趣,或两者兼而有之。
问题有点过时了,但答案就在这里。