|
| 1 | +# 多设备生态:实施计划与任务表 |
| 2 | + |
| 3 | +对应方案 `2026-09-05-multi-device-ecosystem-design.md`。本文只管**做什么、谁依赖谁、 |
| 4 | +判据是什么、现在到哪一步**。方案改了本文跟着改,反之不成立。 |
| 5 | + |
| 6 | +## 0. 状态总览 |
| 7 | + |
| 8 | +| 批次 | 仓库 | 状态 | |
| 9 | +|---|---|---| |
| 10 | +| ⓪ 修已发布的错误示范 | mcpp | 🟡 T0.1/T0.2 ✅,T0.3 待载荷 | |
| 11 | +| ① 载荷 | xim-pkgindex | 🟡 **PR #759**(25 个包,已实测) | |
| 12 | +| ② 引擎 | mcpp | 🟡 进行中 | |
| 13 | +| ③ 发布 | mcpp | ⬜ | |
| 14 | +| ④ 适配面 | mcpp-index | ⬜ | |
| 15 | +| ⑤ 框架 | mcpp-index | ⬜ | |
| 16 | +| ⑥ 生态验证 | 沙箱 | ⬜ | |
| 17 | + |
| 18 | +图例:⬜ 未开始 / 🟡 进行中 / ✅ 完成并有判据 / ⛔ 阻塞 |
| 19 | + |
| 20 | +--- |
| 21 | + |
| 22 | +## 1. 任务表 |
| 23 | + |
| 24 | +### ⓪ 修已发布的错误示范(mcpp,无依赖,立刻做) |
| 25 | + |
| 26 | +| # | 任务 | 判据 | 依赖 | |
| 27 | +|---|---|---|---| |
| 28 | +| T0.1 | 从全部用户文档删除 `[xlings] deps`,`[xlings.workspace]` 为唯一形式 | `git grep -c 'xlings\] deps' docs/` 为 0(中英双份) | — | |
| 29 | +| T0.2 | `examples/09-cuda-kernel` 改用 `[xlings.workspace]` | 示例中不出现 `deps =` | T0.1 | |
| 30 | +| T0.3 | 该示例去 host 化(`-L/usr/...`、`/usr/local/cuda/bin/nvcc`) | 示例与规则包里 `grep -c '/usr'` 为 0 | T1.1 | |
| 31 | + |
| 32 | +### ① 载荷(xim-pkgindex,批内并行) |
| 33 | + |
| 34 | +| # | 任务 | 版本 | 判据 | 依赖 | |
| 35 | +|---|---|---|---|---| |
| 36 | +| T1.1 | ✅ 24 个 CUDA 组件(编译/运行/调试/分析/算子库) | 12.9 线 + 13.3 线 | ✅ 载荷编 sm_89 并在 4080 上跑出 `12 24 36 48`;两线并存可切换 | — | |
| 37 | +| T1.2 | `llvm-offload`(补 slim 载荷缺的 offload 工具) | 22.1.8 | `clang -x cuda -fgpu-rdc` 编链通过 | — | |
| 38 | +| T1.3 | ✅ `dpcpp` | 7.1.0 | ✅ `sycl-ls` 报 `[cuda:gpu] NVIDIA CUDA BACKEND` | — | |
| 39 | +| T1.4 | `pocl` | 7.2 | `clinfo` 出现 CPU 设备 | — | |
| 40 | +| T1.5 | `mesa-lavapipe` | 25.2.8+ | `vulkaninfo` 出现 `PHYSICAL_DEVICE_TYPE_CPU` | — | |
| 41 | +| T1.6 | ✅ 随 T1.1 一并落地 | 13.3.x / 2026.x | 静态检查通过;运行判据待 ⑥ | — | |
| 42 | +| T1.7 | ✅ `libcublas`+四个算子库(上游归档含 static,未再拆) | 13.5.1.27 | ⚠️ static 分包推迟:上游一个归档同时含 shared 与 static,拆包要重打,先按上游形态发 | — | |
| 43 | +| T1.8 | `chipstar` | 1.3.0 | 无卡机器上跑一个 CUDA kernel | T1.4 | |
| 44 | +| T1.9 | `adaptivecpp` | 25.10.0 | `--acpp-targets=omp` 跑 kernel | T1.2 | |
| 45 | +| T1.10 | `hip-runtime` / `hipcc` | 7.14.0 | `HIP_PLATFORM=nvidia` 跑 kernel | T1.1 | |
| 46 | + |
| 47 | +### ② 引擎(mcpp,有序) |
| 48 | + |
| 49 | +| # | 任务 | 判据 | 依赖 | |
| 50 | +|---|---|---|---| |
| 51 | +| T2.1 | **C-1 设备目标原语** `[[target]] kind = "device"` | 单测 + e2e:设备目标不参与常规链接 | — | |
| 52 | +| T2.2 | **C-2 二次链接边** `role = "device-link"` | 跨 TU `__device__` 调用链接成功(C9) | T2.1, T1.2 | |
| 53 | +| T2.3 | **C-3 逐 glob 收窄** | 空集/非子集各报错一次 | T2.1 | |
| 54 | +| T2.4 | ✅ **C-4 `exclusive` 能力声明** | ✅ e2e 601:独占对被拒并点名双方;**对照** —— 不声明的两个提供者照常共存。3 条单测 + 中英文档 + `exclusive-capability` 进机器接口契约页 | — | |
| 55 | +| T2.5 | **C-5 载荷可用性机制** + 探针通道 | 驱动只到 12.4 时请求 13.x ⇒ 构建前拒绝(C2) | — | |
| 56 | +| T2.6 | **C-6 含设备代码的归档** | `.a` 的 `accel` 随包传播(C13) | T2.1 | |
| 57 | +| T2.7 | **C-7 `accel` 维语法开放** | `vulkan1.3` / `sycl:spir64` / `hip:gfx1100` 可解析比较 | — | |
| 58 | +| T2.8 | **把 CUDA 探针搬进规则包** | 核心 grep 不到厂商名字(C15);卸掉规则包 doctor 安静(C16) | T2.5 | |
| 59 | +| T2.9 | **`accel` 表达驱动下界** | PTX 版本高于驱动 ⇒ 构建前拒绝(C20) | T2.5, T2.7 | |
| 60 | +| T2.10 | **未指定设备目标的构建期诊断** | 报「没有为任何可用设备编」而非运行期(C19) | T2.7 | |
| 61 | + |
| 62 | +### ③ 发布(mcpp) |
| 63 | + |
| 64 | +| # | 任务 | 判据 | |
| 65 | +|---|---|---| |
| 66 | +| T3.1 | 版本号 + CHANGELOG + 发布 | GitHub/GitCode 资产 sha256 一致;`ci-fresh-install` 全绿 | |
| 67 | + |
| 68 | +### ④ 适配面(mcpp-index,依赖 ③) |
| 69 | + |
| 70 | +| # | 任务 | 判据 | 依赖 | |
| 71 | +|---|---|---|---| |
| 72 | +| T4.1 | `compat.cuda-runtime` → `compat.cuda-driver` 改名 + `repo` 改正 | 旧名保留一个跳转期 | T3.1 | |
| 73 | +| T4.2 | `compat.vulkan-icd` / `compat.opencl-icd`(缺失时回落载荷) | 无卡机器上 dlopen 到软件实现 | T1.4, T1.5 | |
| 74 | +| T4.3 | `rules-cuda` / `rules-hip` / `rules-sycl` / `rules-spirv` 进索引 | 消费者一行依赖即可用 | T3.1, T2.8 | |
| 75 | +| T4.4 | `compat.cublas` / `cudnn` / `nccl` / `onemkl` | 闭包校验通过 | T1.7 | |
| 76 | + |
| 77 | +### ⑤ 框架(mcpp-index,依赖 ④) |
| 78 | + |
| 79 | +| # | 框架 | 判据(一律用上游自带测试) | 依赖 | |
| 80 | +|---|---|---|---| |
| 81 | +| T5.1 | llama.cpp 多后端(CPU/CUDA/Vulkan/SYCL/HIP) | 各后端推理出正确 token(C4) | T4.3 | |
| 82 | +| T5.2 | ncnn | lavapipe 上分类与 CPU 一致(C5) | T4.2 | |
| 83 | +| T5.3 | CUTLASS | GEMM 与参考比对(C6) | T4.3 | |
| 84 | +| T5.4 | oneDNN | `benchdnn` 两条 lane(C11) | T1.3 | |
| 85 | +| T5.5 | Kokkos | 自带 unit test 两份产物都过(C7) | T4.3 | |
| 86 | +| T5.6 | OpenCV CUDA 模块 | accuracy test(C13) | T4.4 | |
| 87 | +| T5.7 | FAISS | 自带测试 | T4.4 | |
| 88 | +| T5.8 | ONNX Runtime | model test + EP 共存(C12) | T4.4 | |
| 89 | +| T5.9 | libtorch 载荷消费 | 闭包校验(C14) | T4.4 | |
| 90 | + |
| 91 | +### ⑥ 生态验证(沙箱) |
| 92 | + |
| 93 | +| # | 任务 | 判据 | |
| 94 | +|---|---|---| |
| 95 | +| T6.1 | 新建 subos,配 CN mirror,装发布物 | 版本自述正确 | |
| 96 | +| T6.2 | 逐条跑 C0–C20 | 全绿,且每条模拟器 lane 有硬件对照 | |
| 97 | +| T6.3 | 对照:去掉包后判据必须变红 | 每条判据都测到了东西 | |
| 98 | + |
| 99 | +--- |
| 100 | + |
| 101 | +## 2. 并行与关键路径 |
| 102 | + |
| 103 | +``` |
| 104 | +⓪ ──────────────────────────────────────────────► (独立,最先完成) |
| 105 | +
|
| 106 | +① 载荷 ────┬─ T1.1 CUDA ──────────┐ |
| 107 | + ├─ T1.2 llvm-offload ──┤ |
| 108 | + ├─ T1.3 dpcpp ─────────┤ |
| 109 | + ├─ T1.4 pocl ──────────┼──► ④ ──► ⑤ ──► ⑥ |
| 110 | + ├─ T1.5 lavapipe ──────┤ |
| 111 | + └─ T1.6-10 ────────────┘ |
| 112 | + │ |
| 113 | +② 引擎 ── T2.1 ─ T2.2 ─ … ─ T2.10 ┴─► ③ 发布 ─┘ |
| 114 | +``` |
| 115 | + |
| 116 | +⭐ **关键路径是 ②**(引擎有序,十个任务串行),① 与它完全并行。 |
| 117 | +⚠️ ⑤ 的九个框架是工作量主体,T5.1 是 gate —— 它若暴露设计问题,后八个都受影响。 |
| 118 | + |
| 119 | +--- |
| 120 | + |
| 121 | +## 3. 动态更新记录 |
| 122 | + |
| 123 | +方案允许按实际情况改,但每次改必须写下理由。 |
| 124 | + |
| 125 | +| 日期 | 改了什么 | 理由 | |
| 126 | +|---|---|---| |
| 127 | +| 2026-09-05 | 建表 | — | |
| 128 | +| 2026-09-05 | §3.0 改正:xim **推荐** xlings-res 双镜像,但**允许**第三方 URL template + per-arch sha256 | 读 `xpkg-creater/SKILL.md` §资源选择策略;索引里 247 个配方直连 github。我原先写「xim 不 re-host」过绝对 | |
| 129 | +| 2026-09-05 | T0.1/T0.2 完成 | 文档 24 处清零;示例改用 `[xlings.workspace]` | |
| 130 | +| 2026-09-05 | T1.1/T1.3/T1.6/T1.7 落地为 xim PR #759(25 包) | 实测通过:载荷编 sm_89 并在 4080 上跑通;两条线并存可切 | |
| 131 | +| 2026-09-05 | `cuda-cccl` 用显式 per-version URL 而非模板 | 上游把组件从 `cuda_cccl` 改名为 `cccl`,目录名进 URL,一个模板 404 | |
| 132 | +| 2026-09-05 | 配方用 `io.popen` 列文件 | `os.files` 在 `config()` 沙箱里不可用(`attempt to call a nil value`),`llvm.lua` 也用 popen | |
| 133 | +| 2026-09-05 | T2.4 完成 | `exclusive` 是列表不是布尔:一个包可提供多项能力而只有部分独占。schema 警告而非报错,因为绑定期那一处才是执行者 | |
| 134 | +| 2026-09-05 | ⚠️ 本机 shim 被 #582 剪掉一次 | 25 次 `xlings install` 后 `mcpp` 等 7 个裸名 shim 消失,store 完好。重装即恢复 —— 又一次受控复现,补进 issue | |
| 135 | +| 2026-09-05 | `libcublas` 暂不拆 static | 上游一个归档同时含 shared 与 static,拆分需要重打包并 re-host,与「不 re-host」冲突;先按上游形态发,拆分单列 | |
0 commit comments