测量记忆的延迟
measuring latencies of memory
我正在浏览这个链接,他们正在处理主内存、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;
}
通过调整列表的大小,可以控制内存访问是命中一级缓存、二级缓存还是主内存。但是,如果您正在测试二级缓存或主内存,则需要确保每次内存访问都是针对一个足够旧的缓存行,以便在您再次访问它时,它已从更快的缓存中被逐出。一些缓存也支持预取,因此"跨步"方法也可能意味着您可以在某些跨步中使用更快的缓存。
您还需要确保启用优化(-O2
,带有GCC/Clang)。否则,ptr
可能被存储在堆栈上,从而增加延迟。最后,您需要确保编译器不认为ptr
是一个"死"变量。一个复杂的编译器可能会注意到,上面的代码实际上并没有做任何事情。有时在编写基准测试时,编译器是敌人。LMBench代码有一个函数use_pointer()
,仅用于此目的。
相关文章:
- 如何仅为一个函数添加延迟
- 松弛原子与无同步情况下的记忆连贯性
- 以在Qt中的IF语句中设置时间延迟
- 递归函数有效,但无法记忆
- 模板化类中静态成员的延迟初始化
- 在 Windows 8/10 技术中完全实时的屏幕捕获,没有延迟
- 如何将记忆应用于此递归函数?
- 将自定义函数传递到基抽象类中以延迟执行
- 我希望改进或要求我目前的延迟/睡眠方法。C++
- 如何在 c++ 中延迟?
- 共享记忆:让我们谈谈它的特殊性
- 为什么nlohmann不释放记忆
- CPP 中的瓦尔格林德和记忆泄漏:"Conditional jump or move depends on uninitialised values"
- 如何测量管道延迟?
- 获取毫秒延迟的错误值
- C++异常被捕获延迟,可能导致这种情况的原因是什么?
- 我的子类的属性是延迟初始化的
- C++17 多态记忆资源不起作用
- 我是否漏了记忆?
- 测量记忆的延迟