测量记忆的延迟

measuring latencies of memory

本文关键字:延迟 记忆 测量      更新时间:2023-10-16

我正在浏览这个链接,他们正在处理主内存、L1和L2缓存延迟的统计数据。

我想知道,在不使用基准测试工具的情况下,使用C/C++代码是否可以计算出相同的结果?

像LMBench这样的基准测试工具是用C编写的。所以当你问它是否可以用C完成时,答案很简单,"是的"。

LMBench通过执行重复的指针间接寻址来测试内存延迟(在lat_mem_rd.c中)。这与遵循链表是一样的,只是列表中没有内容,只有一个指向下一个单元格的指针。

struct cell { struct cell *next };
struct cell *ptr = ...;
for (i = 0; i < count; i++) {
ptr = ptr->next;
ptr = ptr->next;
... 100 of these, unrolled ...
ptr = ptr->next;
ptr = ptr->next;
}

通过调整列表的大小,可以控制内存访问是命中一级缓存、二级缓存还是主内存。但是,如果您正在测试二级缓存或主内存,则需要确保每次内存访问都是针对一个足够旧的缓存行,以便在您再次访问它时,它已从更快的缓存中被逐出。一些缓存也支持预取,因此"跨步"方法也可能意味着您可以在某些跨步中使用更快的缓存。

您还需要确保启用优化(-O2,带有GCC/Clang)。否则,ptr可能被存储在堆栈上,从而增加延迟。最后,您需要确保编译器不认为ptr是一个"死"变量。一个复杂的编译器可能会注意到,上面的代码实际上并没有任何事情。有时在编写基准测试时,编译器是敌人。LMBench代码有一个函数use_pointer(),仅用于此目的。