别跟我说几率
尽管多数项目第一步会向 AI 咨询,但挑战看似不切实际之事是强项。计划将 NVIDIA RTX 5090 插入 Thunderbolt 扩展坞,再连到 M4 MacBook Air 的 USB - C 端口。Thunderbolt 4 可提供 4 条 PCIe 通道,带宽最高 40Gbps,传输有轻微性能损失,USB4 部分端口也支持。eGPU 在 Linux 和 Windows 基本可用,树莓派也能用(用 Oculink),但 macOS 未为 Apple Silicon 设备配 NVIDIA 或 AMD GPU 驱动。tinygrad 发布了 macOS eGPU 驱动,但用于 AI 推理或游戏不理想,速度比 M4 Pro 原生 Metal 推理慢约 10 倍,且支持有限。Linux 能在 Apple Silicon 的 Mac 上运行,但内核不支持其 Thunderbolt,可在 macOS 主机的 64 位 ARM 虚拟机中运行 Linux 并将 GPU 直通。
在 macOS 上实现 PCI 直通
PCI 设备基础:虚拟机与 PCI 设备通信需满足两个条件,一是 PCI BAR,计算机为设备预留内存区域并映射到虚拟机;二是 DMA,设备可直接读写计算机内存,GPU 能将纹理从计算机内存复制到自身视频内存。映射 PCI BAR:QEMU 启动虚拟机设置内存布局,调用 hvf_set_phys_mem() 函数。实际操作中,虚拟机访问 PCI BAR 内存会使主机内核崩溃,后发现是映射标志问题,修改后问题解决,但仍不完美,写入 BAR 速度比正常慢约 10 倍。DMA:这是项目最棘手部分。在运行 Linux 且支持 VM PCI 直通的 PC 上,计算机与设备直接通信简单,涉及虚拟机则复杂,可通过固定客户机内存或添加 IOMMU 解决。在 Apple Silicon 上,DART 类似 IOMMU,但有诸多限制,如 1.5GB 映射限制、64k 映射上限、无法控制地址和对齐方式等。为此设计了 apple - dma - pci 虚拟 PCI 设备,配套内核驱动程序拦截 NVIDIA 驱动程序的 DMA 映射调用。运行 CUDA 工作负载时出现对齐问题,通过扩展状态检查和热修补可解决。游戏调高设置时会超 64k 映射数量限制,采用簇管理内存方案可减少映射数量,为高画质游戏提供空间。其他性能问题:PCI 直通项目稳定后关注虚拟机整体性能,测试发现 QEMU 未为 vCPU 线程设置优先级,导致性能不稳定且慢。