为 D3D12 运行时设置 LDA 状态
为 D3D12 运行时启用或禁用 LDA 时,UMD 需要将正确的层和节点映射信息返回到运行时。 代码流如下所示:
- D3D12 从 UMD 获取 D3D12_CROSS_NODE_SHARING_TIER 上限。
- D3D12 通过调用 D3DKMTQueryAdapterInfo(KMTQAITYPE_PHYSICALADAPTERCOUNT)从 Dxgkrnl 获取物理适配器计数。
- D3D12 调用 pfnQueryNodeMap(PhysicalAdapterCount, &map) 获取逻辑节点索引到物理节点的映射。 在这种情况下,节点表示物理适配器。 UMD 需要设置映射中的实际物理适配器索引或 D3D12DDI_NODE_MAP_HIDE_NODE 来禁用节点。
- 根据 pfnQueryNodeMap 结果,D3D12 通过不计算隐藏节点来计算有效的物理适配器计数。
- 如果层的状态与有效物理适配器数量不匹配,则 D3D12 将无法创建设备。 出现不匹配的情况是:
- 层级为 D3D12DDI_CROSS_NODE_SHARING_TIER_NOT_SUPPORTED 并且适配器数量大于 1。
- 该层不是 D3D12DDI_CROSS_NODE_SHARING_TIER_NOT_SUPPORTED 并且适配器数量为 1。
要禁用 LDA,UMD 需要返回 D3D12DDI_CROSS_NODE_SHARING_TIER_NOT_SUPPORTED 层,并在节点映射中只启用一个物理适配器。
D3DKMTQueryAdapterInfo(KMTQAITYPE_PHYSICALADAPTERCOUNT)
对物理适配器计数的 KMTQAITYPE_PHYSICALADAPTERCOUNT 查询始终会向来宾返回正确的物理适配器数量:
- 在 Windows 11 版本 22H2 之前的来宾上,它会返回 1。 此值已在访客程序代码中硬编码。 如果 LDA 支持移植到较旧的 OS 版本,将来可能会更改。
- 在 Windows 11 版本 22H2 及更高版本系统上,它将返回:
- 启用 DXGK_FEATURE_LDA_GPUPV 时的实际物理适配器数。
- 否则为 1。
半虚拟化启动
在 BIOS 中启用虚拟化支持(VT-d 或类似)。 对于 VMMS 虚拟机和容器,GPU-PV 设置不同。
set-executionpolicy unrestricted
VMMS 虚拟机设置
设置主机和 VM
VM 中的 OS 内部版本可能比主机中的 OS 内部版本更早或更新。
- 在服务器角色启用 Hyper-V 功能或在客户端启用 Hyper-V 功能。 在服务器上启用此功能时,选择将网络适配器用作外部交换机的选项。
- (可选)启用测试签名 (bcdedit -set TESTSIGNING ON)
- 重新启动。
- 安装支持准虚拟化的 GPU 驱动程序。
(可选)某些驱动程序未设置 ParavirtualizationSupported 上限。 在这种情况下,请在安装驱动程序之前添加以下注册表,或在设置标志后禁用/启用设备。
DWORD HKLM\System\CurrentControlSet\Control\GraphicsDrivers\GpuVirtualizationFlags = 1
- 若要检查 OS 是否识别到半虚拟化 GPU,请执行以下 PowerShell 命令:
Get-VMPartitionableGpu # Example output from running the command Name : \\?\PCI#VEN_10DE&DEV_1C02&SUBSYS_11C210DE&REV_A1#4&275d7527&0&0010#{064092b3-625e-43bf-9eb5-d c845897dd59}\GPUPARAV ValidPartitionCounts : {32} PartitionCount : 32 TotalVRAM : 1,000,000,000 AvailableVRAM : 1,000,000,000 MinPartitionVRAM : 0 MaxPartitionVRAM : 1,000,000,000 OptimalPartitionVRAM : 1,000,000,000 TotalEncode : 18,446,744,073,709,551,615 AvailableEncode : 18,446,744,073,709,551,615 MinPartitionEncode : 0 MaxPartitionEncode : 18,446,744,073,709,551,615 OptimalPartitionEncode : 18446744073709551615 TotalDecode : 1000000000 AvailableDecode : 1000000000 MinPartitionDecode : 0 MaxPartitionDecode : 1000000000 OptimalPartitionDecode : 1000000000 TotalCompute : 1000000000 AvailableCompute : 1000000000 MinPartitionCompute : 0 MaxPartitionCompute : 1000000000 OptimalPartitionCompute : 1000000000 CimSession : CimSession: . ComputerName : MYCOMPUTER-TEST2 IsDeleted : False