单机拓扑
单机拓扑只声明一台机器:一个 QEMU 主机、连接到它的设备进程,以及一个共享内存池。本页说明单机如何组合、进程如何排布、内存池如何计算;可以直接运行的样例见机器目录。
单机的组成
部分 |
作用 |
在 YAML 中的写法 |
|---|---|---|
机器 |
一次会话中的一台独立主机 |
|
主机 |
运行客户机的 QEMU;绑定内存池,提供 QMP、串口与 PCIe 根端口 |
|
设备 |
通过 vfio-user 导出给主机的 PCI 设备 |
|
内存池 |
每台机器一个文件:客户机 RAM 加各设备内存区域 |
由主机 |
flowchart LR
Y[单机 YAML] --> H[QEMU 主机]
H --- P[(内存池)]
D0[设备 0] -->|vfio-user| H
D1[设备 N] -->|vfio-user| H
D0 --- P
D1 --- P
进程扇出
一台机器固定有一个主机进程;每个设备是一个独立进程,
count: 8会得到 8 个设备进程。gem5 MI300X 适配器每个进程只启动一个 GPU(
--num-gpus=1);GPU 数量通过设备数量扩展。设备先于主机启动:设备就绪后向依赖它的主机交出租约,主机停止后释放租约,最后一个租约释放后设备才退出。
单机内部没有跨机器等待;同一文档中的多台机器各自独立,见 多机拓扑。
内存池计算
内存池大小等于客户机 RAM 加上全部设备区域:
拓扑 |
客户机 RAM |
设备区域 |
内存池 |
|---|---|---|---|
|
8 GiB |
16 GiB( |
24 GiB |
|
32 GiB |
8 × 8 GiB = 64 GiB |
96 GiB |
|
8 GiB |
2 × 16 GiB = 32 GiB( |
40 GiB |
|
512 MiB |
1 GiB |
1.5 GiB |
客户机 RAM 位于内存池开头,设备区域按声明顺序追加;
gpu-8的mi300x-0.vram位于 32 GiB,mi300x-7.vram位于 88 GiB。区域大小可以写成整数或
32G这类二进制单位;大小必须是执行系统页大小的整数倍,align必须是不小于一页的 2 的幂(默认 2 MiB)。每台机器的区域偏移与大小写入会话目录的
layout.json,在生成计划阶段就能检查。
运行目录与资源
单机同样获得完整的会话资源:每台机器一个运行子目录、一个内存池文件和一份 layout.json;每个设备一个 vfio-user socket,主机另有 QMP 与串口 socket。运行目录默认为 .cosim/ 下的会话目录,Linux 上内存池目录默认为 /dev/shm/cosim-<name>-<hash>。生命周期细节见 会话生命周期。
一个最小单机示例
version: 1
imports:
- vhosts/qemu.yaml
- devices/gpu/mi300x.yaml
machines:
- id: m0
vhost: {use: vhost-x86}
devices:
- {use: mi300x}
resources/machines/single-gpu.yaml 用模板复用同样的组合;完整的编写规则见 如何编写拓扑 YAML。
源码与证据
样例:
resources/machines/下的全部机器文件。实现:
crates/cosim-topology/src/layout.rs(内存池布局)、crates/cosim-runtime/src/layout.rs(会话路径)。命令:
cosim validate、cosim run --dry-run、cosim graph。
相关页面
拓扑写法:如何编写拓扑 YAML
机器目录:机器目录
内存模型:内存与共享内存模型