测量记忆的延迟

我正在经历这个链接 ,他们正在处理主存储器,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; } 

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

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