【问题标题】:How to test main memory access time?如何测试主存访问时间?
【发布时间】:2013-12-09 14:25:00
【问题描述】:

寻找一个 C/C++ 程序来测试访问一块固定的内存需要多长时间,特别是在 RAM 中。

如何确保测试访问时间不是缓存或 TLB 数据?

例如,我可以“禁用”所有缓存/TLB 吗?

或者我可以在 RAM 中指定一个特定的地址来只写/只读吗?

另一方面,我如何确保我只测试缓存?

有没有办法告诉编译器在哪里保存和读取,缓存/内存?

例如,是否有一个众所周知的标准程序 (in one of these books?) 可以用于此测试?

我确实看到了这个但我不明白如何调整列表的大小,您可以控制内存访问是命中 L1 缓存、L2 缓存还是主内存:measuring latencies of memory

如何正确地编写这个测试?

【问题讨论】:

  • 您可以使用关键字register请求缓存内存...不确定使用较慢的内存...
  • register 是使用CPU寄存器的编译器提示,与高速缓存完全不同......
  • @TonyD 你是绝对正确的......
  • @P.S.没有类似的标准标志,没有。很少有 CPU 支持缓存的软件控制,当它们支持时,很可能是特权操作(即需要 root/admin)。一些 CPU 确实具有用于控制预取和在不填充缓存的情况下访问内存内容的指令——例如MOVNTI(见rz.uni-karlsruhe.de/rz/docs/VTune/reference/vc195.htm)——你也许可以在你的基准测试中使用它。
  • @P.S.大部分对我来说很有意义,尽管我不确定为什么链接指针对测量特别有用……尽管它们是以使缓存无效的方式预先确定遍历顺序的一种方法,然后允许快速页面- 到页面跳转。

标签: c++ c windows memory operating-system


【解决方案1】:

基本上,随着列表的增长,您会看到性能逐步恶化,因为另一层缓存不堪重负。这个想法很简单……如果缓存保存了您访问过的最后 N 个内存单元,那么在甚至 N+1 个单元的缓冲区周围循环应该可以确保不断的缓存未命中。 (您在问题中链接到的“测量记忆延迟”答案中有更多详细信息/注意事项)。

您应该能够从硬件文档中了解可能位于您的 RAM 前面的最大缓存的潜在大小 - 只要您操作的内存多于您应该测量的物理 RAM 时间。

【讨论】:

  • ark.intel.com/products/56056 - 可以假设如果我将超过 2MB 的数据写入“内存”,然后再将其读回,它会丢失缓存还是必须处于循环中?
  • 这是基本的想法......受预取问题的影响。循环可能有助于为您提供足够的样本以避免需要高分辨率时序(读取实时时钟寄存器存在严重问题,除非您将线程固定到内核并且不关心可能的 CPU 时钟频率变化,因为测试期间以及在 Linux 和 Windows 上的省电模式等 - 通常也使用 QueryPerformanceCounter 等)。您可能需要阅读 sisoftware.net/?d=qa&f=ben_mem_latency - 这方面的背景知识。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-22
  • 2020-09-27
  • 1970-01-01
  • 2019-01-21
  • 1970-01-01
  • 1970-01-01
  • 2012-06-09
相关资源
最近更新 更多