2017-12-02 229 views

回答

2

是的,这是可能的,但它不一定像编程通常的PMU计数器一样简单。

一种方法是使用通过PCI空间访问的可编程内存控制器计数器。一个好的开始是通过检查英特尔自己在pcm-memory的执行pcm-memory.cpp。此应用程序向您显示每个插槽或每个内存控制器的吞吐量,这适用于某些用途。特别是,所有内核之间共享带宽,因此在一台安静的机器上,您可以假定大部分带宽都与被测进程相关联,或者如果您想在套接字级别进行监视,则它正是您想要的。

另一种选择是使用“offcore repsonse”计数器的仔细编程。据我所知,这些涉及L2(最后的核心 - 私有缓存)和系统其余部分之间的流量。您可以通过offcore响应的结果进行过滤,因此可以组合各种“L3未命中”事件并乘以高速缓存行大小以获得读取和写入带宽。这些事件是相当精细的,所以你可以进一步将它分解为什么导致访问的第一个地方:指令提取,数据需求请求,预取等,等等。

offcore响应计数器通常滞后于支持工具如perflikwid,但至少最近的版本似乎有合理的支持,即使像SKL这样的客户端部件。

-2

我不确定英特尔PMU,但我认为你可以使用英特尔VTune放大器(https://software.intel.com/en-us/intel-vtune-amplifier-xe)。这个有很多用于性能监视的工具(内存,cpu缓存,cpu)。也许这会为你工作。

+2

VTune是一个使用硬件性能计数器(即PMU =性能监视单元)的工具。除非你能解释*如何让VTune测量内存带宽,否则这不是一个有用的答案。 (VTune是一个有用的工具,可以帮助找到cache-miss热点和类似的东西,显然远不止是简单地记录perf计数器,但这不是这个问题所要求的。) –

4

是(ish),间接。您可以使用计数器之间的关系(包括时间戳)推断其他数字。例如,如果您采样1秒的时间间隔,并且有N个最后一级(3)缓存未命中,则可以非常确信您每秒钟占用N * CacheLineSize字节。

它变得有点棘手把它与准确地计划活动,因为这些缺失可能反映CPU预取,中断活动等

还有的“此CPU不计泥沼(MMX, SSE,AVX等),除非该配置位处于此状态';从而滚动你自己的是繁琐的....