如何查找当前硬件线程的L3缓存索引和NUMA节点索引



我正在为任何Intel或AMD的c系统构建套接字、NUMA节点、缓存、内核和线程的拓扑树。

构建这个层次结构,我想确保硬件线程被适当地分组在一起,以便清楚谁准确地共享什么。我发现我可以设置一个线程的亲和力,然后使用cpuid指令来获得我想要的很多信息,但不是全部。

如果一个包/套接字有多个NUMA节点,我如何获得当前硬件线程的NUMA节点的索引?如果NUMA节点有多个L3缓存,我如何获得索引?

AMD在Fn8000_001E_ECX中有NUMA节点ID的东西,但我找不到英特尔的任何可比的东西。没有re: L3索引

如果一个包/套接字有多个NUMA节点,我如何获得当前硬件线程的NUMA节点的索引?

您可以从ACPI获得此信息。

具体来说,有一个"系统资源关联表";(SRAT),它包含一个结构列表,描述在引导时NUMA域中不同的事物(cpu、内存区域等)所处的位置。80 x86;您将解析此列表,查找"处理器本地APIC/SAPIC亲和结构";和"处理器本地x2APIC亲和结构"。

对于热插拔CPU,表是不够的(当CPU在启动后插入或拔出时,SRAT不会改变),因此您可能还需要使用ACPI机器语言解释器来执行_PXM对象以获得当前NUMA信息。但是,支持热插拔cpu的计算机非常少见。

请注意,在ACPI "NUMA域号"太大(32位)并且不能保证连续(例如,理论上你可以有2个NUMA节点,NUMA域号为0x12345678和0x9ABCDEF0);这意味着你不能将它们用于数组索引(例如,如果你想做"NUMA_stats[domain].CPU_count++;";这不会很有趣)。也没有为"未知NUMA域"保留标准值,这对于确定拓扑的代码来说是不方便的(例如,您需要单独的"是否找到有效的NUMA域");

最新更新