测量记忆的延迟

时间:2012-11-28 11:27:39

标签: c++ c memory operating-system

我正在经历这个link,他们正在处理主内存,L1和L2缓存延迟的统计数据。

我想知道是否可以使用C / c ++代码计算相同的内容而不使用基准测试工具?

1 个答案:

答案 0 :(得分:1)

基准工具,如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;
}

通过调整列表大小,您可以控制内存访问是否命中L1缓存,L2缓存或主内存。但是,如果要测试L2缓存或主内存,则需要确保每个内存访问的缓存行都足够大,以便在您再次访问它时从较快的缓存中逐出。一些缓存也支持预取,所以一个&#34; strided&#34;方法也可能意味着您在某些步伐中获得了更快的缓存。

您还需要确保启用优化(-O2,使用GCC / Clang)。否则ptr可能会存储在堆栈中,从而增加了延迟。最后,您需要确保编译器不会将ptr视为&#34; dead&#34;变量。一个复杂的编译器可能会注意到上面的代码实际上并没有任何东西。有时在编写基准时,编译器就是敌人。 LMBench代码只有一个函数use_pointer()