【问题标题】:How does lmbench measure L1 and L2 cache latencies using C? (cannot understand explanation in manual)lmbench 如何使用 C 测量 L1 和 L2 缓存延迟? (无法理解手册中的解释)
【发布时间】:2013-11-22 19:49:12
【问题描述】:

我试图了解 lmbench 如何测量 L1、L2 和主内存的延迟。

lat_mem_rd 的man page 提到了该方法,但我不清楚:

基准测试作为两个嵌套循环运行。外环是步幅 尺寸。内部循环是数组大小。对于每个数组大小, 基准创建一个指针环,指向向前迈出一大步。 遍历数组是通过

p = (char **)*p;

在 for 循环中(for 循环的开销并不重要; loop 是一个展开的循环,长度为 1000 个负载)。执行后循环停止 一百万次加载。

你如何“创建一个指向前一步的指针环”?这是否意味着如果步幅大小为 128 字节,您将需要创建一个链表,其中每个节点与前一个节点之间的距离正好为 128 字节? malloc 只是返回一些随机的空闲内存,所以我看不出这在 C 中是如何实现的。 在这段代码中,我总是会遇到分段错误。 (测试了一下,p应该用什么初始化?)

在 SO(link) 上有一个类似的线程,第一个答案讨论了这一点,但它没有讨论如何将跨步方法与链接列表一起使用。我还查看了源代码本身(lat_mem_rd.c),但也无法从中理解。

感谢任何帮助。

【问题讨论】:

    标签: c linux pointers caching benchmarking


    【解决方案1】:

    您可以分配大块内存,然后在您想要的任何边界上的已分配块内排列链表的元素。

    【讨论】:

    • 如果实际分配的内存在连续数组中,那么我可以大步迭代它,甚至不需要链表。 (如果步幅是 8 个字节,我可以访问整数数组中的所有其他元素)。由于这是最简单和最明显的方法,而 lmbench 没有使用它,一定是因为它不起作用(不足以欺骗预取器?)。有什么想法吗?
    • 如果您只是在现代 Intel CPU 上的连续数组中大步迭代,硬件预取器将启动并在 CPU 发出需要该数据的指令之前开始推测性地从内存中获取数据。此外,CPU 本身会认为元素之间没有依赖关系,并且能够发出多条指令以并行获取独立的数据块。理想情况下,您希望获取下一个元素取决于当前元素的数据。这将确保引擎盖下的硬件没有机会变得太聪明。链表完成了这项工作。
    • 嗯...有道理。这回答了我的问题。谢谢:)
    猜你喜欢
    • 2014-02-16
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 2014-07-04
    • 1970-01-01
    • 2013-01-20
    • 2017-03-10
    • 2014-02-17
    相关资源
    最近更新 更多