Wil*_*son 6 c c++ x86 numa cpuid
我正在用 C 为任何 Intel 或 AMD 系统构建套接字、NUMA 节点、缓存、内核和线程的拓扑树。
构建这个层次结构,我想确保硬件线程被适当地组合在一起,以便清楚谁精确地共享什么。我发现我可以设置线程的关联性,然后使用该cpuid
指令获取我想要的很多信息,但不是全部。
如果包/套接字有多个 NUMA 节点,如何获取当前硬件线程的 NUMA 节点索引?如果NUMA节点有多个L3缓存,如何获取索引?
AMD在 NUMA 节点 ID 中有一些东西Fn8000_001E_ECX
,但我找不到任何可与Intel相媲美的东西。没有任何关系:L3 索引。
如果一个包/套接字有多个 NUMA 节点,如何获取当前硬件线程的 NUMA 节点索引?
您可以从 ACPI 获取此信息。
具体来说,有一个“系统资源关联表”(SRAT),其中包含一个结构列表,描述启动时不同事物(CPU、内存区域等)所在的 NUMA 域。对于 80x86;您可以解析此列表,查找“处理器本地 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 域”标志来跟踪)。
归档时间: |
|
查看次数: |
60 次 |
最近记录: |