跳转至

06 UMD 零系统调用提交延迟定量计算

1. 传统系统调用路径 vs 用户态直通提交路径

graph TD
    subgraph TraditionalSyscall["传统系统调用路径 (~2.35 us)"]
        App1["用户态应用"] -->|ioctl 系统调用| Kernel1["内核态 DRM 驱动"]
        Kernel1 -->|参数校验 + 锁竞争| Ring1["写入内核 Ring Buffer"]
        Ring1 -->|MMIO 写| Reg1["写硬件寄存器"]
    end

    subgraph UserModeDoorbell["用户态直通 Doorbell 路径 (~0.35 us)"]
        App2["用户态 UMD (libcuda)"] -->|直接写入 mmap 共享 Ring Buffer| Ring2["用户态映射 Ring Buffer"]
        Ring2 -->|一条 mov 汇编写 BAR0| Reg2["硬件 Doorbell 寄存器"]
    end

2. 详细耗时拆解与定量推导

执行阶段 传统 ioctl 提交耗时 UMD 用户态 Doorbell 提交耗时 性能提升幅度
Command Packet 组包 100 ns 100 ns 相同
用户/内核上下文切换 850 ns (Trap, 寄存器保存恢复) 0 ns (无系统调用) \(\infty\)
内核互斥锁与参数校验 1150 ns (VMA 校验与 Mutex) 0 ns \(\infty\)
MMIO 触发 (PCIe Write) 250 ns 250 ns (用户态直写 BAR0) 相同
单次任务下发总时延 2350 ns (2.35 \(\mu\)s) 350 ns (0.35 \(\mu\)s) 快 6.7 倍