c++ - 测量内存的潜伏期

标签 c++ c memory operating-system

我正在经历这个 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/

相关文章:

C++通过for循环插入数组

c++ - 将字符串转换为运算符

c++ - 为什么应用程序二进制接口(interface)对编程很重要

memory - 重新加载 Pytorch 模型时出现 CUDA 内存不足错误

python - python什么时候删除变量?

GCC/codeblocks 的 C++ STL 映射编译器问题

c++跨多个.cpp文件调用函数?

无法使用库 dc1394 在视频模式 format7_4 下设置图像大小

c - 如果一个线程锁定了一个互斥量并且没有解锁它,那么其他线程不应该被阻塞吗?

javascript - 输入中带有 base64 编码图像的 POST 导致 Chrome 内存泄漏 - 如何解决?