overview kernel live cycle

sequenceDiagram
    participant W as 推理/workload
    participant D as 驱动 (guest 写 MMIO)
    participant G as 模拟设备 (QEMU)
    W->>D: 要跑 C[tid]=f(tid) 的并行 kernel
    D->>G: 1. GLOBAL_CTRL.ENABLE
    G-->>D: MMIO handler 置 READY
    D->>G: 2. kernel 机器码+输入写进 VRAM (BAR2 直写 vram_ptr)
    D->>G: 3. 设 KERNEL_ADDR / GRID_DIM / BLOCK_DIM
    D->>G: 4. 写 DISPATCH 触发
    Note over G: 遍历 grid×block×lane,tid 编码进每线程 mhartid,<br/>从 VRAM 取 kernel 用 RV32 解释器跑到 ebreak,结果写回 VRAM
    G-->>D: 5. 置 KERNEL_DONE + READY (无真中断,只置状态位)
    D->>G: 轮询 READY / IRQ_STATUS 等完成
    D->>G: 6. 从 VRAM 读结果 (BAR2 读 vram_ptr)

DISPATH exe model (SIMT)

flowchart TD
    DISP["写 DISPATCH"] --> GRID["遍历 grid_dim x/y/z"]
    GRID --> BLK["遍历 block_dim x/y/z"]
    BLK --> WARP["按 32 lane 起 warp"]
    WARP --> LANE["每 lane: tid = MHARTID_ENCODE(block,warp,lane)"]
    LANE --> ENC["tid 编码进该线程 mhartid"]
    ENC --> INTERP["从 KERNEL_ADDR 取指,迷你 RV32I(+F) fetch-decode-exec"]
    INTERP --> EB{"ebreak?"}
    EB -- 否 --> INTERP
    EB -- 是 --> WB["C[tid] 写回 VRAM"]
    WB --> DONE["全线程跑完 -> 置 IRQ_STATUS.KERNEL_DONE + READY"]