【问题标题】:How to measure memory bandwidth utilization on Windows?如何测量 Windows 上的内存带宽利用率?
【发布时间】:2011-03-24 02:20:22
【问题描述】:

我有一个高度线程化的程序,但我认为它不能很好地跨多个内核扩展,因为它已经使所有内存带宽饱和。

是否有任何工具可以测量正在使用的内存带宽?

编辑:请注意,典型的分析器会显示内存泄漏和内存分配等我不感兴趣的内容。 我只是内存带宽是否饱和。

【问题讨论】:

  • 如果你想要一个系统管理员工具,你需要指定你的操作系统。你想要一个编程工具,你需要指定编程语言。
  • 其实,没有。从 CPU 通过缓存到主内存的内存带宽是一个完全独立于编程语言的低级概念。
  • 它的窗口。我编辑了标题以反映这一点。同意 msalters,编程语言与内存带宽测量无关。
  • 通过“编程工具”,我的意思是您可能希望将其包含到您自己的代码中,而不是将其作为单独的应用程序运行。我应该让自己更清楚。
  • 您似乎非常非常不可能测量内存带宽利用率。您当然可以测量内存带宽,但是当其他应用程序正在运行时您无法测量它,然后期望两个值之间的差异是使用的内存带宽。除非 CPU 或内存控制器中内置了某些东西,否则您无法执行此操作。没听说过。。

标签: windows performance profiling


【解决方案1】:

很难找到一个工具来测量您的应用程序的内存带宽利用率。

但是由于您面临的问题是可疑的内存带宽问题,您可以尝试测量您的应用程序是否每秒产生大量页面错误,这肯定意味着您离理论内存带宽还很远。

您还应该衡量您的算法对缓存的友好程度。如果他们正在破坏缓存,您的内存带宽利用率将受到严重阻碍。谷歌在告诉你如何做到这一点的好资源上“测量缓存未命中”。

【讨论】:

    【解决方案2】:

    我推荐 Visual Studio Sample Profiler,它可以收集特定硬件计数器上的示例事件。例如,您可以选择对缓存未命中进行采样。 Here's an article explaining how to choose the CPU counter,尽管您也可以使用其他计数器。

    【讨论】:

      【解决方案3】:

      如果您有最新的 Intel 处理器,您可以尝试使用 Intel(r) Performance Counter Monitor:http://software.intel.com/en-us/articles/intel-performance-counter-monitor/ 它可以直接测量内存控制器消耗的内存带宽。

      【讨论】:

      • 有没有一种工具可以使用这些数据并将其打印出来?
      • 英特尔性能计数器监视器已停产。相反,他们为 github 上的 fork Processor Counter Monitor 贡献更新和新功能:github.com/opcm/pcm
      • AMD Ryzen CPU 是否有同等产品?
      【解决方案4】:

      使用任何纯软件解决方案都无法正确测量内存总线利用率。 (它曾经是,早在 80 年代左右。但后来我们得到了流水线、缓存、乱序执行、多核、具有多条总线的非统一内存架构等)。

      您绝对必须让硬件监控内存总线,以确定它有多“忙”。

      幸运的是,大多数 PC 平台都有一些,因此您只需要驱动程序和其他软件即可与之对话:

      wenjianhn 在https://github.com/opcm/pcm 发现有一个专门针对英特尔硬件(他们称之为处理器计数器监视器)的项目

      对于 Windows 上的其他架构,我不确定。但是有一个项目(针对 linux)在https://github.com/RRZE-HPC/likwid

      处提供了对不同架构的支持。

      原则上,计算机工程师可以将合适的示波器连接到几乎任何 PC 并“直接”进行监控,尽管这可能需要经过适当培训的计算机工程师以及相当高性能的测试仪器(阅读:两者都非常昂贵)。

      如果您自己尝试此操作,请知道您可能需要了解您打算监控使用的总线协议的仪器或至少分析。

      这有时真的很容易,使用一些总线 - 例如旧的并行 FIFO 硬件,通常有一条单独的线用于“fifo full”和另一条用于“fifo empty”。

      此类芯片通常用于单向链路上较快的总线和较慢的总线之间。 'fifo full' 信号,即使它通常偶尔触发,也可以被监控为过长的电平:对于 USB 2.0 高速链路的示例,当操作系统没有轮询 USB fifo 硬件时会发生这种情况时间。通过测量这些“阻塞”的频率和持续时间,您可以测量总线利用率,但仅限于此 USB 2.0 总线。

      对于 PC 内存总线,我想您也可以尝试监控您的 RAM 接口正在使用多少电量 - 这可能会随着使用而扩展。这可能很难做到,但你可能会“走运”。您需要为总线提供 VccIO 的电源电流。对于较新的 PC 硬件,这实际上应该比那些古老的 80 年代系统(在开启时总是以全功率运行)更好。

      对于这些示例中的任何一个来说,一个相当普通的示波器就足够了 - 您只需要一个只能在“超过给定宽度的脉冲”上触发的示波器,并让它一直运行直到它触发,这是一个很好的“浸泡”方法长期测试。

      您可以通过查找“空闲”时间的变化来监控使用情况。

      但现代 PC 内存总线要复杂得多,速度也快得多。

      要通过轻敲总线直接执行此操作,您至少需要一个专门设计用于监控您的 PC 的 DDR 总线生成的示波器(和有源探头),以及软件分析选项(通常单独出售)对协议进行足够的解码,以找出其上发生的活动类型,从中您可以确定您想要将哪种活动测量为“空闲”。

      您甚至可能需要一个旨在让您也进行这些测量的主板。

      这并不像仅仅寻找没有活动的时期那么简单——所有 DRAM 至少需要定期刷新周期,这可能会或可能不会与明显的总线活动一起发生(有些 DRAM 会自动执行,有些需要触发它的特定命令,有些可以继续寻址和传输来自未刷新的银行的数据,有些不能,等等)。

      因此,仪器需要能够对数据进行足够深入的分析,以便您了解它的繁忙程度。

      您最好、最简单的选择是找到一家拥有可满足您需求的工具的 PC 硬件 (CPU) 供应商,然后购买该硬件以便您可以使用这些工具。

      这甚至可能涉及在 VM 中运行您的应用程序,因此您可以从托管它的不同操作系统中的更好工具中受益。

      为此,您可能想尝试 Linux KVM(是的,即使对于 Windows - 也有适用于它的 Windows 客户驱动程序),并将您的 VM 固定到特定的 CPU,同时您还配置 linux 以避免将相同 CPU 上的其他作业。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-24
        • 2011-04-12
        • 1970-01-01
        • 2015-09-17
        • 2016-04-25
        • 2021-11-20
        • 2020-11-08
        相关资源
        最近更新 更多