Skip to content

Commit e01f4d4

Browse files
committed
docs(design): §12 — what the implementation overturned, produced, and left
Five places the plan was wrong and two defects the implementation created and fixed, each with the reading that settled it. Also what a consumer writes after this batch, and the list of what remains with the reason each item is not done rather than a silence that reads as done.
1 parent dfc02e8 commit e01f4d4

1 file changed

Lines changed: 63 additions & 0 deletions

File tree

.agents/docs/2026-09-05-multi-device-ecosystem-design.md

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1180,3 +1180,66 @@ lane 结论一致;只跑模拟器,等于把「lavapipe 说对了」当成「它
11801180
第三档的「CUDA 只能上真卡」删除,代之以 §5 的矩阵;
11811181
- **§12** 的阶段表 —— 「未做」的理由全部作废,代之以 §5 的 lane 与 §9 的判据;
11821182
- **§15.8** —— 两条「缺授权」的结论作废,代之以 §4.2 与 §3.1。
1183+
1184+
---
1185+
1186+
## 12. 实施后自我 review(2026-09-05)
1187+
1188+
方案写完之后由实施推翻或补上的地方。**只记与本文所写不同的**;相符的部分见
1189+
实施计划表的判据列。
1190+
1191+
### 12.1 被实施推翻的
1192+
1193+
| 本文写的 | 实测 | 处置 |
1194+
|---|---|---|
1195+
| C-1「设备目标原语」是新的 `[[target]] kind = "device"` | `mcpp::action` 已有四种角色,artifact 的产物不进链接、object 的进链接,且 ninja 按路径连边 —— 「不参与常规链接、被某条边消费的产物」**就是** artifact 角色 | 不新增 target kind。再加一种是同一个决定写第二遍 |
1196+
| C-5 的驱动取数由核心完成 | 仓库自带的 `test_runtime_contract` 禁止「厂商词 + 探针启动」在 `src/` 共现,抓住了写下的 `nvidia-smi` 调用 | 关系留在核心并单测,**取数改由声明抵达**;`doctor` 的整节与 `mcpp.toolchain.devicehost` 一并删除 |
1197+
| C9(RDC 真机)在本机可测 | nvcc 路线**两端同时被挡**:12.9 满足驱动而不满足 C 库(C23 `cospi`/`rsqrt``noexcept` 冲突),13.3 满足 C 库而不满足驱动(要 ≥13.0,本机 12.4) | 判据退回 e2e 607 所测的**通用链式 action**;真机 RDC 留给有 13.x 驱动的机器,并在示例 README 里写明为什么 |
1198+
| ① 已完成 | 13.x 的 `cuda-nvcc` **装完不能用**:nvcc`$(TOP)/nvvm/bin/cicc` 找后端,而 13.x 把 `nvvm/``crt/` 拆成了独立包=独立载荷根 | xim #760。修法的形状:**无条件写链接**,不要求嵌套安装成功 —— 它失败无声且两种拼法都不可靠 |
1199+
| T1.5「lavapipe 载荷」是新增包 | 现有 `xim:mesa` 载荷里**只有 RADV**,没有 `libvulkan_lvp.so`,也没有 rusticl | 仍待做,且不是新增包而是**重打 mesa 载荷**(`-Dvulkan-drivers=…,swrast` + `-Dgallium-rusticl=true`)。T1.4 同理 |
1200+
1201+
### 12.2 实施自己造出来又修掉的
1202+
1203+
- **「没有加速器」被写成了显示用的 `(none)`** `accel_str` 为空集打印 `(none)`
1204+
是给 ABI 标签读的;`resolvedAccel` 把这个拼法当值传了出去,于是
1205+
`MCPP_ACCEL=(none)` 到达**每一个从未提过加速器的工程**,而指纹里
1206+
`if (!accel.empty())` 恒真。e2e 605 第四段标题写着「变量与 layer 都清空」
1207+
却只测了 layer —— 这就是它逃过套件的原因。判据只能靠构建程序**写文件**取得:
1208+
它的 stdout 只在非零退出时才打印。
1209+
- **设备源的映射按裸包名索引。** 同一张图里两个包可以同名不同命名空间;
1210+
改按包根索引。合入前重读 diff 时发现,没有测试覆盖它。
1211+
1212+
### 12.3 生态级 review:这一轮之后,一个消费者看到的是什么
1213+
1214+
一个要用 GPU 的工程现在写三样东西,各自答给不同的所有者:
1215+
1216+
```toml
1217+
[xlings.workspace] # 载荷:工程自己选版本
1218+
"xim:cuda-nvcc" = "12.9.86"
1219+
1220+
[dependencies.compat] # 机器:驱动由机器决定,包只负责够到它
1221+
cuda-driver = "2026.09.05"
1222+
cublas = "12.9.1.4" # 算子库:载荷 + 构建面,两个仓库各管一半
1223+
1224+
[build] # 轴:写一次,规则包据此推导自己的开关
1225+
accel = "cuda12.9+{sm_89} ptx>=89"
1226+
```
1227+
1228+
**核心不认识其中任何一个厂商名字**,这条由 `test_core_vendor_probes` 在剥掉
1229+
注释的源码上执行,并自带分母。
1230+
1231+
三条已被生态执行的规则在本轮各验证一次:
1232+
GPU 索引包不自己探测宿主(委托 xim sentinel);链宿主 `libcudart` 会被闭包
1233+
校验拒掉(所以 `compat.cudart` farm 的是载荷而不是宿主);打包后的
1234+
`runtime.artifacts` 是封闭白名单(新增产物字段两个读取器都要查)。
1235+
1236+
### 12.4 仍然没有做的,以及理由
1237+
1238+
|| 理由 |
1239+
|---|---|
1240+
| T1.2 `llvm-offload` | `dpcpp@7.1.0` 载荷自带全套 offload 工具,需要 RDC 的工程可用它;独立包仍待做 |
1241+
| T1.4 / T1.5(pocl / lavapipe)与 T4.2 | 需要**重打 mesa 载荷**(见 12.1 末行),或新建 pocl 源码构建配方。两者都是多小时的载荷工程 |
1242+
| T1.8/T1.9/T1.10(chipstar / adaptivecpp / hip) | 依赖 T1.2/T1.4 |
1243+
| T4.3 规则包进索引 | 依赖 ③ —— 描述符指向 mcpp 的**源码 tarball**(`grpcgen` 同形),tag 不存在则算不出 sha256。规则包已改名到 `mcpplibs` 命名空间,就是为了让它可被引用而不是被复制 |
1244+
| ⑤ 九个框架 | 依赖 ④ 的规则包条目。`ggml-org.llamacpp``opencv.opencv` 已在索引里,多后端是改**它们各自的 `-m` 仓库**而不是索引条目 |
1245+
| T2.6 的端到端判据 | `accel` 已是 `pack::AbiTag` 第四维并进指纹;「`.a` 随包传播」还缺一条跨包的判据 |

0 commit comments

Comments
 (0)