如何计算对远程NUMA内存节点的内存访问?

时间:2011-08-11 12:11:47

标签: multithreading numa papi

在最近的Linux分布式共享内存系统上运行的多线程应用程序中,是否有直接的方法来计算每个线程到远程(非本地)NUMA内存节点的请求数?

我正在考虑使用PAPI来计算互连流量。这是要走的路吗?

在我的应用程序中,线程在整个生命周期中都绑定到特定的核心或处理器。当应用程序开始时,内存将以页面方式分配,并以循环方式在所有可用的NUMA内存节点上进行传播。

感谢您的回答。

2 个答案:

答案 0 :(得分:3)

如果您有权访问VTune,则本地和远程NUMA节点访问由硬件计数器OFFCORE_RESPONSE.ANY_DATA.OTHER_LOCAL_DRAM_0计数,用于快速本地NUMA节点访问,OFFCORE_RESPONSE.ANY_DATA.REMOTE_DRAM_0用于较慢的远程NUMA节点访问。

计数器如何出现在VTune中:

Configuring NUMA hardware counters in VTune

计数器在两种情况下的外观如何:

NUMA不满意代码:核心0(NUMA节点0)增加驻留在NUMA节点1上的50 MB: NUMA unhappy code with many remote NUMA node accesses

NUMA快乐代码:核心0(NUMA节点0)增加驻留在NUMA节点0上的50 MB: NUMA happy code with many local NUMA node accesses

答案 1 :(得分:-1)

我不确定这是否合格是直接的,我不知道“分布式共享内存系统”是什么,但是,无论如何,在普通的Linux上,如果你有权访问源代码,你可以算一下请求你自己。您可以使用我的答案“我可以从指针地址获取NUMA节点吗?”问题here以确定内存请求的节点是什么,并且知道线程所在的节点是否正在计算远程请求。这只会告诉您使用远程内存的频率,而不是当内存不在本地缓存中并且必须被提取时,这可能不是您想要的。

如果您想了解远程内存上的缓存未命中,请尝试在您的问题中添加分析标记 - 它可能会吸引更多读者。如果有一个能够区分本地内存未命中和远程内存未命中的分析器,我也有兴趣了解它。