3

我有一个Intel(R) Core(TM) i7-4720HQ CPU @ 2.60GHz( Haswell) 处理器。随着时间的推移,我需要检索每个 DRAM rank的访问次数,以估计其功耗。根据芯片组文档的页面(即数据表,第 2 卷(M 和 H 处理器线)),我可以使用寄存器中的 32 位值,作为 DRAM 能量估计。但我需要等级能量估计。我还可以使用核心核心DRAM 访问性能计数器来估计功耗,但是,如前所述,我需要per-rank 统计信息除此之外261RAM—DRAM_ENERGY_STATUS,他们报告整个系统的统计数据,而能量是按等级计算的。他们也没有报告许多 DRAM 访问。

因此,IMC计数器(非核心计数器)应该是理想的选择。Perf不支持per-rank计数器。我尝试使用来访问柜台信息。但是没有内核挂载(版本是)并且该工具没有检测到 CPU。我试图手动访问非核心性能计数器。此处记录了整个系统DRAM 访问计数器(它们记录在上述芯片组手册中)。我可以找回PCM-MemoryIMC/sys/bus/event_source/devices/uncore_imc5.0.0-37-generic使用这些计数器的DRAM读取写入访问。但是,没有关于频道等级访问统计的信息。如何找到与这些计数器关联的偏移量?我应该使用反复试验吗?


PS:这个问题也在英特尔软件调优、性能优化和平台监控论坛上提出。

4

1 回答 1

3

总是报告所有内存通道的MSR_DRAM_ENERGY_STATUS能量消耗估计。没有简单的方法可以将其分解为每个等级的能量。该登记册报告了对 Haswell 的高度准确估计。

5.0.0-37-generic内核是 Ubuntu 内核,支持 Haswell 上的uncore_imc/data_reads/uncore_imc/data_writes/事件,分别代表来自 IMC 的数据读取 CAS 命令和数据写入 CAS 命令。完整的高速缓存行读取和完整的高速缓存行写入事务导致内存总线上的单个突发 64 字节事务到单个列。部分读取也作为总线上的单个全行读取执行,但由于协议的限制,部分写入可能需要全行读取,然后是全行写入。部分写入通常可以忽略不计。

uncore_imc/data_reads/和事件发生在针对任何单元生成的 DRAM 内存的uncore_imc/data_writes/请求,而不仅仅是内核。这些名称由perf和 它们分别对应于UNC_IMC_DRAM_DATA_READSUNC_IMC_DRAM_DATA_WRITES,它们在您引用的英特尔文章中提到。那里提到的其他三个事件允许您分别计算三个可能源(GT、IA 和 IO)中的每一个的请求(不是 CAS 命令!)。您不会/sys/bus/event_source/devices/uncore_imc/events在旧内核下找到它们。perf从主流内核 v5.9-rc2 开始支持它们。

顺便说一句,PCM它也支持这些事件,它用于报告所有通道的读写带宽,但您应该使用该工具pcm.x,而不是pcm-memory.x仅适用于服务器处理器的工具。

Haswell H 处理器线处理器具有一个带有两个 DDR3L 64 位通道的片上内存控制器。每个通道可以包含零个、一个或两个 DIMM,所有通道的总容量高达 32 GB。此外,每个 DIMM 最多可以包含两个列,因此单个通道可以包含零到四个列之间的任何位置。i7-4720HQ 是一款高端移动处理器。您可能使用的是具有 8 GB 或 16 GB 内存的笔记本电脑。如果内存拓扑在购买后没有改变,它可能只有两个 4GB 或 8GB DIMM,每个通道一个,如果用户需要,每个通道还有一个剩余空闲插槽可用于扩展。这意味着每个通道有一个或两个等级。

给定物理地址如何映射到等级的知识,您可以估计每个等级的访问次数。如果每个通道都装有相同容量的单列 DIMM,则在您的处理器上映射很简单。物理地址的第 6 位(即第 7 位)决定了请求映射到哪个通道,从而决定了哪个等级。您可以通过使用该选项在 IMCperf record上运行来收集一组请求的物理地址样本。显然,这组样本可能仅代表到达 IMC 的源自核心的退役负载,它们是 IMC 上所有请求的一小部分。MEM_LOAD_UOPS_L3_MISS_RETIRED.LOCAL_DRAM--phys-data

在我看来,您想测量每个 rank 的内存访问次数,以便从 DRAM 总能量中估计每 rank 的能量,但这一点也不简单,原因如下:

  • 并非所有 CAS 命令都具有相同的能量成本。预充电和激活命令不计入任何事件,可能会消耗大量能量,尤其是在高行缓冲区未命中率的情况下。
  • 即使 IMC 中的请求为零,只要至少有一个活动内核,内存通道就会被供电并且确实会消耗能量。
  • 由于 rank-to-rank 周转和读写切换所需的时间延迟,处理相同类型和相同地址的请求所需的时间量可能会因周围的请求而异。

尽管如此,我认为给定对每个等级的请求数量的代表性估计(如上所述),我认为有可能建立一个关于每个等级能量上限和下限的良好模型。

底线是,没有简单的方法可以像在服务器处理器上那样获得按等级计数的奢侈。

于 2021-03-12T16:57:48.073 回答