总是报告所有内存通道的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_READS
和UNC_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 周转和读写切换所需的时间延迟,处理相同类型和相同地址的请求所需的时间量可能会因周围的请求而异。
尽管如此,我认为给定对每个等级的请求数量的代表性估计(如上所述),我认为有可能建立一个关于每个等级能量上限和下限的良好模型。
底线是,没有简单的方法可以像在服务器处理器上那样获得按等级计数的奢侈。