1.2 HSA的Topology sysfs 布局与发现机制
摘要本文聚焦 KFD Topology 的发现过程——内核如何通过 sysfs 暴露拓扑信息libhsakmt 如何一次性加载为内存快照以及 Node ID 映射、generation_id 等辅助机制。各 Properties 的字段详解见后续专题文档。前文给出了描述异构系统的四个维度本文关注的是KFD 如何将前三个维度计算节点、内存层次、互联拓扑的信息从内核空间暴露给用户态以及 libhsakmt 如何存储这些信息。整个发现流程可以概括为三步内核暴露KFD 驱动将拓扑信息组织为 sysfs 目录树每个实体节点、内存、缓存、链路对应一个properties文件。用户态加载libhsakmt 在初始化时一次性遍历 sysfs将文本键值对解析为类型化的 C 结构体形成内存中的拓扑快照。增量维护通过generation_id检测拓扑变化必要时重建快照。下面从 sysfs 的目录布局开始逐步展开每个环节。1. sysfs 目录结构1.1 信息从哪里来sysfs 中的拓扑目录不是凭空出现的它是 KFD 内核驱动在加载时根据硬件发现结果创建的。信息来源链路如下GPU 硬件寄存器 / VBIOS / ACPI 表 │ ▼ amdgpu 驱动枚举 PCIe 设备读取 GPU 硬件能力 │ ▼ KFD 驱动kfd_topology.c ├── 从 amdgpu 获取 GPU 节点信息CU 数、VRAM 大小、引擎数等 ├── 从 ACPI/NUMA 获取 CPU 节点和互联距离 ├── 从 PCIe 配置空间获取链路带宽/宽度 └── 调用 sysfs API 创建目录和 properties 文件 │ ▼ /sys/devices/virtual/kfd/kfd/topology/ ← 用户态可见内核侧的关键入口kfd_topology_init()— KFD 模块初始化时创建顶层 sysfs 目录kfd_topology_add_device()— 每发现一个 GPU创建对应nodes/{id}/及其子目录mem_banks、caches、io_links、p2p_links各properties文件的内容由驱动将硬件寄存器值、VBIOS 信息转换为key value\n格式的文本1.2 目录布局KFD 驱动在/sys/devices/virtual/kfd/kfd/topology/下暴露完整的拓扑树/sys/devices/virtual/kfd/kfd/topology/ ├── generation_id # 拓扑版本号uint32任何拓扑变化时递增 ├── system_properties # 系统全局属性键值对文本 │ └── nodes/ ├── 0/ # Node 0 │ ├── properties # 节点核心属性 │ ├── mem_banks/ # 内存区域列表 │ │ ├── 0/properties │ │ └── ... │ ├── caches/ # 缓存层次列表 │ │ ├── 0/properties │ │ └── ... │ ├── io_links/ # IO 链路列表 │ │ ├── 0/properties │ │ └── ... │ └── p2p_links/ # P2P 直连链路 │ ├── 0/properties │ └── ... │ ├── 1/ │ └── ... └── ...设计原则每个 properties 文件都是纯文本键值对key value\n格式目录编号由内核分配可能不连续子目录数量记录在父 properties 中如mem_banks_count 42. sysfs → 数据结构映射总览内容比较多我会分成多个小节来分析。sysfs 路径数据结构详解文档topology/system_propertiesHsaSystemProperties本文topology/nodes/{id}/propertiesHsaNodeProperties03-NodeProperties详解topology/nodes/{id}/mem_banks/{j}/propertiesHsaMemoryProperties[j]04-MemoryProperties详解topology/nodes/{id}/io_links/{j}/propertiesHsaIoLinkProperties[j]05-IoLinkProperties详解topology/nodes/{id}/p2p_links/{j}/propertiesHsaIoLinkProperties[j]05-IoLinkProperties详解topology/nodes/{id}/caches/{j}/propertiesHsaCacheProperties[j]06-CacheProperties详解3. HsaSystemProperties系统级结构体描述整个平台的全局信息typedefstruct_HsaSystemProperties{HSAuint32 NumNodes;// 系统中 KFD 节点总数HSAuint32 PlatformOem;HSAuint32 PlatformId;HSAuint32 PlatformRev;}HsaSystemProperties;对应 sysfssystem_properties: platform_oem 0 platform_id 0 platform_rev 0NumNodes不在文件中直接给出而是通过遍历nodes/目录统计得出。4. 拓扑快照机制4.1 设计思想libhsakmt 不逐次访问 sysfs而是在hsaKmtOpenKFD()时一次性加载全部拓扑信息到内存后续查询直接返回缓存数据。4.2 快照流程hsaKmtOpenKFD() └── topology_take_snapshot() │ ├── 1. 读取 generation_id → 记录当前版本 │ ├── 2. 读取 system_properties → 填充 HsaSystemProperties │ ├── 3. 遍历 nodes/ 目录 │ ├── 统计有效节点数 │ └── 建立 user_id → sysfs_id 映射 │ ├── 4. 对每个节点 i │ ├── 读取 properties → HsaNodeProperties[i] │ ├── 读取 mem_banks/*/prop → HsaMemoryProperties[i][] │ ├── 读取 caches/*/prop → HsaCacheProperties[i][] │ ├── 读取 io_links/*/prop → HsaIoLinkProperties[i][] │ └── 读取 p2p_links/*/prop → 合并到 io_links │ └── 5. 间接链路推导 → 补充缺失的节点对连接4.3 Node ID 映射sysfs 中的节点编号由内核分配可能不连续如热插拔后编号不回收。libhsakmt 在步骤3中建立映射数组屏蔽这一问题staticuint32_tmap_user_to_sysfs_node_id[MAX_NODES];// map_user_to_sysfs_node_id[0] 0 (sysfs node 0)// map_user_to_sysfs_node_id[1] 1 (sysfs node 1)// map_user_to_sysfs_node_id[2] 3 (sysfs node 3, 跳过了 2)上层应用始终使用 0, 1, 2, … 的连续编号调用 APIlibhsakmt 内部翻译为实际 sysfs 路径。4.4 快照释放hsaKmtCloseKFD() └── topology_drop_snapshot() ├── 释放所有节点的 MemoryProperties 数组 ├── 释放所有节点的 CacheProperties 数组 ├── 释放所有节点的 IoLinkProperties 数组 ├── 释放 NodeProperties 数组 └── 重置 SystemProperties4.5 generation_id 与重新加载// 检测拓扑是否变化uint32_tcurrent_genread_generation_id();if(current_gen!cached_generation_id){topology_drop_snapshot();topology_take_snapshot();// 重新加载}适用场景GPU 热插拔、驱动重载等。实际上大多数系统中拓扑在启动后不变。5. sysfs 文件解析实现5.1 解析模式所有 properties 文件采用统一的解析方式// 伪代码FILE*ffopen(/sys/.../nodes/0/properties,r);while(fscanf(f,%s %llu,key,value)2){if(strcmp(key,cpu_cores_count)0)node-NumCPUCoresvalue;elseif(strcmp(key,simd_count)0)node-NumFComputeCoresvalue;// ... 逐字段匹配}5.2 容错处理未知字段跳过前向兼容新内核添加的字段缺失字段保持结构体默认值 0文件打开失败标记该节点无效不计入 NumNodes5.3 CPU 节点的额外信息源CPU 节点仅靠 KFD sysfs 信息不完整需补充额外信息源补充内容/proc/cpuinfoCPU 型号、核心频率/sys/devices/system/cpu/cpu*/cache/L1/L2/L3 缓存大小、行大小、关联度ACPI SRAT/SLIT (间接通过 NUMA)NUMA 距离6. 小结机制作用sysfs 目录树内核暴露拓扑的标准接口快照一次加载、多次查询避免重复 I/ONode ID 映射屏蔽内核编号不连续问题generation_id检测拓扑变化触发重加载间接链路推导补全拓扑图提供全连接视图

相关新闻

面试官问我:“什么时候微调、什么时候RAG?”,我:“模型效果不好,需要判断是因为它‘不知道‘,还是因为它‘做不好‘,面试官不断点头

面试官问我:“什么时候微调、什么时候RAG?”,我:“模型效果不好,需要判断是因为它‘不知道‘,还是因为它‘做不好‘,面试官不断点头

现实里,项目一开始你面对的根本不是"怎么微调"。 而是这个问题: 这个需求,到底该上 RAG,还是该微调? 这是大模型应用开发里最高频的架构选型题,也是面试官最爱问的一道。 “你这个项目为什么…

2026/6/30 2:28:11阅读更多 →
云腾五洲TE100边缘计算盒子:内置物联网平台

云腾五洲TE100边缘计算盒子:内置物联网平台

在万物互联的时代浪潮下,边缘计算正成为推动行业数智化转型的关键力量。云腾五洲TE100边缘计算盒子(以下简称TE100)应运而生——它是一款集数据采集、协议转换、本地计算与云端协同于一体的边缘智能硬件,致力于解决工业物联网场景…

2026/6/30 2:28:11阅读更多 →
服务网格——让微服务“自动驾驶“的黑科技

服务网格——让微服务“自动驾驶“的黑科技

服务网格——让微服务"自动驾驶"的黑科技 你有没有开过特斯拉? 生活场景:手动挡 vs 自动挡 手动挡时代(传统微服务) 开车你需要: 踩离合 挂挡 加油 松离合 控制车速 观察路况 每一步都要手动操作,分心就可能出事。 自动挡时代(服务网格) 开车你只需要:…

2026/6/30 2:28:11阅读更多 →
冰合试剂分享┃敌草畏 - D3 / 氘代麦草畏 / CAS 349553-95-3 / Dicamba-d3 / 稳定同位素氘代内标

冰合试剂分享┃敌草畏 - D3 / 氘代麦草畏 / CAS 349553-95-3 / Dicamba-d3 / 稳定同位素氘代内标

环境水体、果蔬谷物、土壤样本中敌草畏残留定量检测是环境分析常规实验,普通外标法受基质效应干扰严重,质谱检测回收率波动大,定量数据准确度偏低;普通敌草畏标准品不具备同位素特征碎片,无法校正样本前处理、色谱质谱…

2026/6/30 3:23:14阅读更多 →
使用MapLibre实现多条线平滑拖拽

使用MapLibre实现多条线平滑拖拽

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>MapLibre 多线平滑曲线编辑器</title><!…

2026/6/30 3:23:14阅读更多 →
深入ModSecurity-nginx源码:从Nginx模块到WAF集成的核心机制与实战

深入ModSecurity-nginx源码:从Nginx模块到WAF集成的核心机制与实战

1. 项目概述&#xff1a;为什么需要深入ModSecurity-nginx的源码&#xff1f;如果你是一名Web安全工程师、运维开发或者对Nginx底层机制有浓厚兴趣的开发者&#xff0c;那么“ModSecurity-nginx”这个项目你一定不陌生。它不是一个独立的Web服务器&#xff0c;而是连接两个重量…

2026/6/30 3:23:14阅读更多 →
同一段vec_dot,AVX2 / VNNI / NEON / WASM 四条 SIMD 路径:为什么预填充能拉开 4 倍,解码却几乎一样快?

同一段vec_dot,AVX2 / VNNI / NEON / WASM 四条 SIMD 路径:为什么预填充能拉开 4 倍,解码却几乎一样快?

把 llama.cpp 编译出 AVX2 和 AVX-512 VNNI 两个版本,拿同一个 7B Q4_0 模型跑 llama-bench,你会看到一组分裂的数字:prompt eval(预填充)那一栏,VNNI 比 AVX2 快 43%;token generation(解码)那一栏,两者几乎贴在一起,差不到 5%。 同一段热点代码、同一颗 CPU、同一…

2026/6/30 3:23:14阅读更多 →
智谱拼好模come on

智谱拼好模come on

快来快来快来快来快来快来 &#x1f64b;蹲队友拼智谱 Coding Plan&#xff01; &#x1f9e9;国内顶流编程大模型&#xff0c;20主流工具全适配&#xff0c;性价比拉满&#xff0c; &#x1f449;立即参与「拼好模」&#xff1a;https://www.bigmodel.cn/glm-coding?icP4XO4C…

2026/6/30 3:23:14阅读更多 →
提涨薪像提一次资源扩容申请——几类谈薪辅助工具横评

提涨薪像提一次资源扩容申请——几类谈薪辅助工具横评

做后端的都提过扩容申请&#xff1a;现有资源不够用了&#xff0c;你得拿监控数据和负载曲线去说服 owner 批预算&#xff0c;而不是上来就喊"我要更多机器"。提涨薪几乎是同一回事——你的产出和承担早就超了当前"配额"&#xff0c;难点在于怎么拿数据把这…

2026/6/30 3:18:13阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月&#xff0c;Boris Cherny 公开宣布自己卸载了 IDE。一时间&#xff0c;Vibe Coding 成了全行业最热的话题。6个月后&#xff0c;当我们回过头来拉一份真实账本&#xff0c;发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/6/29 3:27:55阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言&#xff1a;审计结束三个月了&#xff0c;审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间&#xff0c;内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中&#xff0c;审计…

2026/6/29 2:19:08阅读更多 →
为什么你需要Destiny 2 Solo Enabler:技术原理与实战指南

为什么你需要Destiny 2 Solo Enabler:技术原理与实战指南

为什么你需要Destiny 2 Solo Enabler&#xff1a;技术原理与实战指南 【免费下载链接】Destiny-2-Solo-Enabler Repo containing the C# and XAML code for the D2SE program. Included is also the dependency for the program, and image asset. 项目地址: https://gitcode…

2026/6/30 0:02:58阅读更多 →
第六章:PowerPoint 2010 核心功能与实战应用 —— 从入门到精通

第六章:PowerPoint 2010 核心功能与实战应用 —— 从入门到精通

1. PowerPoint 2010基础操作全攻略 刚接触PowerPoint 2010时&#xff0c;很多人会被它复杂的界面吓到。其实只要掌握几个核心区域&#xff0c;就能快速上手。我最开始用PPT时&#xff0c;经常找不到功能按钮在哪&#xff0c;后来发现主要操作都集中在顶部功能区。 工作窗口主要…

2026/6/30 0:02:58阅读更多 →
XGBoost超参数实战:从理论到调优策略

XGBoost超参数实战:从理论到调优策略

1. XGBoost超参数基础认知 第一次接触XGBoost时&#xff0c;我被它那密密麻麻的参数列表吓到了。这感觉就像面对一架波音747的驾驶舱——每个按钮都可能有神奇的效果&#xff0c;但按错了就可能坠机。经过多年实战&#xff0c;我发现其实掌握十几个核心参数就能解决90%的问题。…

2026/6/30 0:02:59阅读更多 →