如何获取当前硬件线程对应的L3缓存索引与NUMA节点索引
问题解决方案
1. NUMA节点索引获取
AMD平台
你已知的方案完全可用:执行cpuid Fn8000_001E指令,读取ECX寄存器的[15:8]字段,即可直接得到当前硬件线程对应的NUMA节点ID,Zen1及之后的AMD处理器均支持该特性。
Intel平台
Intel没有提供直接通过单条cpuid指令读取NUMA节点ID的寄存器,你可以通过以下两种方式实现:
- 低开销方案:先通过
cpuid 0x01指令读取EBX寄存器的[31:24]字段,得到当前硬件线程的初始APIC ID,再通过解析ACPI SRAT表,匹配APIC ID对应的NUMA节点索引即可。 - 简化用户态方案:直接读取sysfs节点映射关系,内核已经完成了SRAT表的解析工作,你可以遍历
/sys/devices/system/node/下的节点目录,将CPU逻辑编号和NUMA节点索引建立映射,运行时通过当前线程绑定的CPU编号直接查询即可。
2. L3缓存索引获取
Intel和AMD均有统一的cpuid查询方案,不需要单独适配:
- 先通过
cpuid 0x00指令判断厂商:返回字符串为GenuineIntel对应Intel,AuthenticAMD对应AMD。 - 对应厂商选择缓存拓扑cpuid叶子:Intel用
0x04,AMD用0x8000001D,两者的返回值格式完全兼容。 - 调用cpuid时ECX寄存器传入
3(代表查询L3缓存属性),返回的EAX寄存器的[14:0]字段即为当前硬件线程所属的L3缓存ID,同一个L3缓存下的所有硬件线程读取到的该值完全一致,可直接作为L3缓存索引使用。
内容的提问来源于stack exchange,提问作者Will Leiserson
相关产品推荐
相关产品推荐

