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

How to find the L3 cache index and NUMA node index for the current hardware thread

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

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

如果 package/socket 有多个 NUMA 节点,如何获取当前硬件线程的 NUMA 节点索引?如果NUMA节点有多个L3缓存,如何获取索引?

AMD has something for NUMA node ID in Fn8000_001E_ECX, but I can't find anything comparable for Intel。没有任何回复:两者的 L3 索引。

If a package/socket has multiple NUMA nodes, how do I get an index of the NUMA node for the current hardware thread?

您可以从 ACPI 获取此信息。

具体来说,有一个“系统资源亲和性 Table”(SRAT),其中包含一个结构列表,描述了哪些 NUMA 域不同的东西(CPUs,内存区域,...)在启动时。对于 80x86;您将解析此列表以查找“Processor Local APIC/SAPIC Affinity Structures”和“Processor Local x2APIC Affinity Structures”。

对于热插拔 CPUs table 是不够的(当 CPU 在启动后插入或移除时 SRAT 不会改变),所以你可能还需要使用 ACPI 机器语言解释器执行 _PXM 个对象来获取当前的 NUMA 信息。支持热插拔的计算机 CPUs 非常罕见。

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