1

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

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

4

1 回答 1

3

基准测试工具,如 LMBench,是用 C 语言编写的。所以当你问是否可以用 C 语言完成时,答案很简单,“可以”。

lat_mem_rd.cLMBench通过重复指针间接测试内存延迟(in )。这和跟随链表是一样的,只是链表中没有内容,只是指向下一个单元格的指针。

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()专门用于此目的的功能。

于 2012-11-28T12:09:11.553 回答