我正在经历这个link,他们正在处理主内存,L1和L2缓存延迟的统计数据。
我想知道是否可以使用C / c ++代码计算相同的内容而不使用基准测试工具?
答案 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()
。