我正在尝试使用一些非核心硬件计数器,例如: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?或者还有什么解释?