我有一个高度线程化的程序,但我相信它不能很好地跨越多个核,因为它已经饱和了所有的内存带宽。
有什么工具可以测量内存带宽的使用情况吗?
编辑:请注意,典型的分析器显示诸如内存泄漏和内存分配之类的内容,我对此并不感兴趣。我只知道内存带宽是否饱和。
发布于 2021-05-24 02:58:51
使用任何类型的软件解决方案都不可能正确地测量内存总线的使用情况。(过去是80年代左右的时候。然后,我们得到了流水线、高速缓存、无序执行、多核、多总线的非均匀存储体系结构等)。
你绝对需要有硬件监控内存总线,以确定它有多“忙”。
幸运的是,大多数PC平台都有一些,所以您只需要使用驱动程序和其他软件来与其对话:
温建恩评论说,在https://github.com/opcm/pcm有一个专门针对英特尔硬件(他们称之为处理器计数器监视器)的项目。
对于Windows上的其他体系结构,我不确定。但是有一个项目(对于linux),它为https://github.com/RRZE-HPC/likwid的不同体系结构提供了大量的支持。
原则上,计算机工程师可以在几乎任何一台PC上安装一个合适的示波器,并“直接”进行监测,尽管这可能需要一名受过适当训练的计算机工程师以及相当高性能的测试仪器(两者都非常昂贵)。
如果您自己尝试这一点,请知道您可能需要一些工具,或者至少需要分析,因为它们知道您要监视的总线协议的使用情况。
这有时真的很容易,与一些总线-例如旧的并行FIFO硬件,它通常有一个单独的电线'fifo满‘和另一个为'fifo空’。
这样的芯片通常在高速总线和慢速总线之间使用,在单向链路上。“fifo全速”信号,即使它通常偶尔触发,也可以被监控过长的级别:例如USB2.0高速链路,当操作系统没有及时轮询USB fifo硬件时,就会发生这种情况。测量这些“延迟”的频率和持续时间,然后允许您测量总线的使用情况,但只适用于这个USB2.0总线。
对于PC内存总线,我猜你也可以尝试仅仅监控你的RAM接口使用了多少电源--这可能会随着使用而扩展。这可能很难做到,但你可能会“走运”。您需要为总线提供VccIO的电源的电流。这实际上应该比那些古老的80年代的系统更适用于较新的PC硬件(老80年代的系统在开机时总是全速运行)。
一个相当普通的示波器对这两个例子中的任何一个都足够了--你只需要一个只能触发“脉冲超过给定宽度”的示波器,并让它一直运行,这是进行长时间“浸泡测试”的好方法。
您可以通过查找空闲时间的变化来监控使用情况。
但是现代的PC内存总线要复杂得多,也要快得多。
要想直接按下总线,您至少需要一个明确设计的示波器(和活动探针)来监视您的PC所拥有的DDR总线的生成,以及软件分析选项(通常是单独出售)来对协议进行足够的解码,以确定发生在其上的活动类型,从中可以确定您想要测量的是“空闲”的活动类型。
您甚至可能需要一个主板设计,让您作出这些测量也。
这并不像寻找没有活动的时间段那样严格--所有DRAM至少需要定期刷新周期,这可能与明显的总线活动一起发生,也可能不会发生(一些DRAM会自动执行,有些需要一个特定的命令来触发它,一些可以继续寻址和传输来自没有刷新的银行的数据,有些不能,等等)。
因此,仪器需要能够对数据进行足够深入的分析,以便提取出它有多忙。
你最好,也是最简单的选择是找到一个拥有你想要的工具的PC硬件(CPU)供应商,然后买下那个硬件,这样你就可以使用这些工具了。
这甚至可能包括在VM中运行您的应用程序,这样您就可以从托管它的不同操作系统中获得更好的工具。
为此,您可能希望尝试Linux (是的,甚至对于Windows --有windows客户驱动程序),并将VM固定在特定的CPU上,同时配置linux以避免将其他作业放在相同的CPU上。
https://stackoverflow.com/questions/3386042
复制相似问题