在最近的Linux分布式共享内存系统上运行的多线程应用程序中,是否有直接的方法来计算每个线程到远程(非本地)NUMA内存节点的请求数?
我正在考虑使用PAPI来计算互连流量。这是要走的路吗?
在我的应用程序中,线程在整个生命周期中都绑定到特定的核心或处理器。当应用程序开始时,内存将以页面方式分配,并以循环方式在所有可用的NUMA内存节点上进行传播。
感谢您的回答。
答案 0 :(得分:3)
如果您有权访问VTune,则本地和远程NUMA节点访问由硬件计数器OFFCORE_RESPONSE.ANY_DATA.OTHER_LOCAL_DRAM_0计数,用于快速本地NUMA节点访问,OFFCORE_RESPONSE.ANY_DATA.REMOTE_DRAM_0用于较慢的远程NUMA节点访问。
计数器如何出现在VTune中:
计数器在两种情况下的外观如何:
NUMA不满意代码:核心0(NUMA节点0)增加驻留在NUMA节点1上的50 MB:
NUMA快乐代码:核心0(NUMA节点0)增加驻留在NUMA节点0上的50 MB:
答案 1 :(得分:-1)
我不确定这是否合格是直接的,我不知道“分布式共享内存系统”是什么,但是,无论如何,在普通的Linux上,如果你有权访问源代码,你可以算一下请求你自己。您可以使用我的答案“我可以从指针地址获取NUMA节点吗?”问题here以确定内存请求的节点是什么,并且知道线程所在的节点是否正在计算远程请求。这只会告诉您使用远程内存的频率,而不是当内存不在本地缓存中并且必须被提取时,这可能不是您想要的。
如果您想了解远程内存上的缓存未命中,请尝试在您的问题中添加分析标记 - 它可能会吸引更多读者。如果有一个能够区分本地内存未命中和远程内存未命中的分析器,我也有兴趣了解它。