我正在经历这个 link他们正在处理主内存、L1 和 L2 缓存的延迟统计数据。
我想知道是否可以在不使用基准测试工具的情况下使用 C/c++ 代码进行相同的计算?
最佳答案
像 LMBench 这样的基准测试工具是用 C 编写的。所以当你问它是否可以用 C 完成时,答案很简单,"is"。
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;
}
通过调整链表的大小,可以控制内存访问是命中一级缓存、二级缓存还是主存。但是,如果您正在测试 L2 高速缓存或主内存,则需要确保每次内存访问都是针对一个足够旧的高速缓存行,以便在您再次访问它时它已从更快的高速缓存中逐出。一些缓存还支持预取,因此“跨步”方法也可能意味着您会在某些跨步中访问更快的缓存。
您还需要确保启用优化(-O2
,使用 GCC/Clang)。否则 ptr
可能会存储在堆栈中,从而增加延迟。最后,您需要确保编译器不会将 ptr
视为“死”变量。一个老练的编译器可能会注意到上面的代码实际上没有做任何事情。有时在编写基准测试时,编译器是敌人。 LMBench 代码有一个函数 use_pointer()
就是为了这个目的。
关于c++ - 测量内存的潜伏期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13603995/