【问题标题】:Performance Counter for DRAM Per-Rank Memory AccessDRAM Per-Rank 内存访问的性能计数器
【发布时间】:2021-06-10 00:28:33
【问题描述】:

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

因此,IMC 计数器(即 uncore 计数器)应该是理想的选择。 Perf支持per-rank计数器。我尝试使用PCM-Memory 访问IMC 柜台信息。但是/sys/bus/event_source/devices/uncore_imc由内核安装的(版本是5.0.0-37-generic)并且该工具确实检测CPU。我尝试手动访问uncore性能计数器。 整个系统 DRAM 访问计数器已记录在案,here(它们记录在上述芯片组手册中)。我可以使用这些计数器检索 total DRAM readwrite 访问。但是,没有关于频道等级访问统计的信息。如何找到与这些计数器相关的偏移量?我应该使用反复试验吗?


P.S.:这个问题也在Intel Software Tuning, Performance Optimization & Platform Monitoring Forum问。

【问题讨论】:

  • 请注意,同时交叉发布 (https://community.intel.com/t5/Software-Tuning-Performance/Performance-Counter-for-DRAM-Per-Rank-Memory-Access/m-p/1263575) 并不酷,尤其是在没有将它们链接在一起的情况下,因为这可能会导致多人的努力浪费。
  • @HadiBrais,但是在多个论坛中提问会增加答案的概率。因为不是一个论坛的所有成员都会成为另一个论坛的成员。什么是替代解决方案?
  • 对,但不应该发生不同的人努力为同一个问题基本上发布相同的答案。您可以在一个论坛上发布问题,等待几天,如果没有人提供好的答案,然后将其发布到其他地方。将问题相互关联也是一种很好的做法,这样任何论坛的人都可以看到关于同一问题的所有活动。
  • @HadiBrais,我在两个论坛中都添加了链接。

标签: performancecounter perf energy memory-access intel-pmu


【解决方案1】:

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

顺便说一下,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 位)决定了请求映射到哪个通道,从而确定了哪个等级。您可以通过使用--phys-data 选项在MEM_LOAD_UOPS_L3_MISS_RETIRED.LOCAL_DRAM 上运行perf record,在IMC 收集一组请求的物理地址样本。显然,这组样本可能仅代表到达 IMC 的源自核心的退役负载,它们是 IMC 上所有请求的一小部分。

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

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

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

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

【讨论】:

  • 感谢您的全面回答!我如何确认排名访问统计信息在从MCHBAR 开始的32 KB 空间中的某个偏移量处报告?这些统计数据没有看起来存储起来那么复杂!
  • 我的内核支持上述events。您对phys-data 的建议是合理的。考虑到 一些调度 微操作以及 所有写访问 被省略的事实,它是否可靠足够
  • 我的笔记本电脑有一个8 GB列)和一个4 GB列)DIMM,每个都在一个不同的频道。我认为数据表匹配主板。我认为每个通道只有 一个 插槽,因此最多支持 1 个 DIMM。物理地址的第一个 8 GB交错的(可能具有64 字节的粒度)btwn 2 个通道,[8GB-12GB[ 范围映射到 更大的 DIMM。最终,我将不得不移除较小的 DIMM 以实现 可以逆向工程更简单映射.
  • “它是否足够可靠...”取决于您正在处理的工作负载。您必须证明或争论采样的负载地址提供了 IMC 上所有请求的代表性按等级分布。这对于简单的基准测试来说很容易,但您可能必须使用模拟器来进行真正的基准测试。
  • 我在32 KB 的整个32 KB 范围内检查了32 Bit 的值(即,在04、...的偏移处)。他们似乎都没有关系。他们中的大多数是。一些 constant 和其他 not 匹配 整个系统 计数器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-06
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
  • 2020-05-19
相关资源
最近更新 更多