4

我正在尝试使用一些非核心硬件计数器,例如:skx_unc_imc0-5::UNC_M_WPQ_INSERTS. 它应该计算写入挂起队列的分配数量。该机器有 2 个采用级联湖架构的 Intel Xeon Gold 5218 CPU,每个 CPU 有 2 个内存控制器。linux 版本是 5.4.0-3-amd64。我有以下简单的循环,我正在阅读这个计数器。数组元素大小为 64 字节,等于缓存行。

for(int i=0; i < 1000000; i++){
        array[i].value=2;
}

对于这个循环,当我将内存映射到 DRAM NUMA 节点时,计数器会给出大约 150,000 个结果,这可能是有道理的:在这个 NUMA 节点前面的2 个内存控制器总共有 6 个通道,它们在交错中使用 DRAM DIMM模式。然后对于每个频道,我相信都有一个单独的 WPQ,因此 skx_unc_imc0 从整个商店中获得 1/6。skx_unc_imc0-5我得到了一些计数器papi_native_avail,据说每个计数器都用于不同的频道。

意外的结果是,我没有将程序映射到 DRAM NUMA 节点,而是将程序映射到非易失性内存,该内存作为单独的 NUMA 节点呈现到同一个套接字。每个插槽有 6 个 NVM DIMM,可创建一个交错区域。因此,当写入 NVM 时,应该使用类似的 6 个不同的通道,并且在每个通道前面,有相同的一个 WPQ,应该再次获得 1/6 写入插入。

UNC_M_WPQ_INSERTS在 NV 内存上仅返回 1000 左右。 我不明白为什么;我预计它会在 WPQ 中提供类似的大约 150,000 次写入。

我在解释/理解错误吗?或者每个通道是否有两个不同的 WPQ,具体取决于写入到 DRAM 还是 NVM?或者还有什么解释?

4

1 回答 1

2

事实证明,它只UNC_M_WPQ_INSERTS计算写入挂起队列的分配数量,仅用于写入 DRAM。英特尔为 Persistent Memory 添加了相应的硬件计数器:UNC_M_PMM_WPQ_INSERTS它计算在英特尔® 傲腾™ DC 持久内存的 PMM Write Pending Queue 中分配的写入请求。

但是,没有出现这样的本机事件,papi_native_avail这意味着它还不能用 PAPI 监控。在 linux 5.4 版本中,一些 PMM 计数器可以直接在perf list uncoreunc_m_pmm_bandwidth.write- Intel Optane DC 持久内存带宽写入 (MB/sec) 中找到,派生自unc_m_pmm_wpq_inserts,单位:uncore_imc。这意味着即使没有直接作为事件UNC_M_PMM_WPQ_INSERTS列出,它也应该存在于机器上。perf list

如此处所述,此计数器的 EventCode 为:0xE7,因此它可以与 perf 一起用作原始硬件事件描述符,如下所示:perf stat -e uncore_imc/event=0xe7/。但是,它似乎不支持使用 perf 指定用户空间计数的事件修饰符。然后将线程固定在与 NVM NUMA 节点相同的套接字中之后,对于基本上只执行问题中描述的循环的程序,结果perf有点有意义:

Performance counter stats for 'system wide':  1,035,380    uncore_imc/event=0xe7/

到目前为止,这似乎是最好的猜测。

于 2020-03-25T21:23:46.990 回答