我有一个高度线程的程序,但我相信它无法在多个内核中很好地扩展,因为它已经使所有内存带宽饱和。
是否有任何工具可以测量正在使用多少内存带宽?
编辑:请注意,典型的分析器会显示内存泄漏和内存分配等内容,我对此并不感兴趣。 我只是内存带宽是否饱和。
答案 0 :(得分:10)
如果你有最近的英特尔处理器,你可能会尝试使用英特尔(r)性能计数器监视器:http://software.intel.com/en-us/articles/intel-performance-counter-monitor/它可以直接测量内存控制器消耗的内存带宽。
答案 1 :(得分:3)
我建议使用Visual Studio Sample Profiler,它可以收集特定硬件计数器上的示例事件。例如,您可以选择对缓存未命中进行采样。 Here's an article explaining how to choose the CPU counter,虽然您也可以使用其他计数器。
答案 2 :(得分:2)
很难找到一个测量应用程序内存带宽利用率的工具。
但是,由于您遇到的问题是可疑的内存带宽问题,您可以尝试测量您的应用程序是否产生大量页面错误/秒,这肯定意味着您不在理论内存带宽附近。
您还应该测量算法的缓存友好程度。如果它们正在颠覆缓存,那么内存带宽利用率将受到严重阻碍。谷歌“测量缓存未命中”的良好来源告诉你如何做到这一点。
答案 3 :(得分:0)
使用任何类型的纯软件解决方案都无法正确测量内存总线利用率。 (曾经是,早在 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 上的其他作业。