window 显示驱动开发-驱动程序处理的Multiple-Processor优化
如果驱动程序将执行其自己的多处理器优化,则它不得实现 LockAsync、 UnlockAsync 和 Rename 函数。 在这种情况下,驱动程序必须调用 pfnSetAsyncCallbacksCb 函数,以通知运行时运行时是启动还是停止接收来自工作线程的运行时回调函数的调用。
如果驱动程序执行自己的多处理器优化,则应遵循 Direct3D 运行时在确定启用多处理器优化时使用的相同策略。 此策略允许跨所有进程公平共享系统资源。 具体而言,在以下情况下,驱动程序应禁用多处理器优化:
- 应用程序在窗口模式下运行。
- 计算机仅包含一个处理器 (或处理器核心) ;驱动程序应在具有超线程的单处理器计算机上禁用优化。
- 应用程序请求不启用多处理器优化,或者应用程序使用软件顶点处理;此信息将传递到驱动程序的 CreateDevice 函数。
如果供应商想要在这些情况下启用多处理器优化,应首先联系 Microsoft。
1. 自主优化时的函数禁用
若驱动选择实现自己的多处理器优化,必须禁止实现以下异步函数:
禁用场景 | 判断方法 |
---|---|
窗口模式应用 | 检查 PresentParameters.Windowed = TRUE 。 |
单核CPU(含超线程) | 通过 GetSystemInfo 获取 dwNumberOfProcessors = 1 。 |
应用显式请求禁用 | CreateDevice 的 BehaviorFlags 包含 D3DCREATE_SINGLETHREADED 。 |
软件顶点处理 | BehaviorFlags 包含 D3DCREATE_SOFTWARE_VERTEXPROCESSIN |
驱动需显式通知运行时:
调用 pfnSetAsyncCallbacksCb 声明自主接管多线程控制:
// 在驱动初始化时调用
DXGKARG_SETASYNCCALLBACKS AsyncCallbacks = {0};
AsyncCallbacks.bDisableRuntimeThreading = TRUE; // 禁用运行时多线程回调
pDeviceFuncs->pfnSetAsyncCallbacksCb(hDevice, &AsyncCallbacks);
2. 多处理器优化的启用/禁用策略
驱动必须遵循与 Direct3D 运行时相同的资源公平共享策略,在以下场景强制禁用优化:
禁用场景 | 判断方法 |
---|---|
窗口模式应用 | 检查 PresentParameters.Windowed = TRUE 。 |
单核CPU(含超线程) | 通过 GetSystemInfo 获取 dwNumberOfProcessors = 1 。 |
应用显式请求禁用 | CreateDevice 的 BehaviorFlags 包含 D3DCREATE_SINGLETHREADED 。 |
软件顶点处理 | BehaviorFlags 包含 D3DCREATE_SOFTWARE_VERTEXPROCESSING 。 |
代码示例:
BOOL ShouldEnableMultiprocessorOptimization(D3DDDIARG_CREATEDEVICE* pArgs,const SYSTEM_INFO* pSysInfo
) {// 检查禁用条件if (pArgs->BehaviorFlags & (D3DCREATE_SINGLETHREADED | D3DCREATE_SOFTWARE_VERTEXPROCESSING) ||pSysInfo->dwNumberOfProcessors == 1 ||pArgs->pPresentParams->Windowed) {return FALSE;}return TRUE;
}
3. 特例:厂商自定义优化
若厂商希望在禁用场景(如窗口模式)下仍启用优化,需:
- 联系 Microsoft:提交优化方案的技术与安全性评估。
- 实现隔离机制:确保不影响其他进程的资源公平性(如限制GPU占用率)。
4. 多线程安全要求
注意事项 | 实现要求 |
---|---|
资源竞争 | 使用原子操作或锁保护共享状态(如命令队列)。 |
内存一致性 | 对GPU可见内存使用 MemoryBarrier 保证数据同步。 |
线程优先级 | 避免高优先级线程饿死系统任务(如 THREAD_PRIORITY_NORMAL )。 |
示例(命令队列线程安全):
std::atomic<UINT> m_CommandCount;void SubmitCommand(COMMAND* pCmd) {UINT idx = m_CommandCount.fetch_add(1, std::memory_order_acq_rel);m_CommandQueue[idx] = *pCmd;
}
5. WHCK 认证测试项
测试项 | 验证目标 |
---|---|
Device.Graphics.UMD.MultiThreadSafety | 自主优化下的线程安全性(无崩溃/死锁)。 |
Device.Graphics.UMD.SingleProcessor | 单核CPU时优化是否正确禁用。 |
Device.Graphics.UMD.WindowedMode | 窗口模式下优化是否禁用 |
6. 调试建议
工具:
- Windows Performance Analyzer (WPA):分析线程竞争与调度延迟。
- DirectX Debug Runtime:检测非法跨线程调用。
日志:记录优化开关状态与线程ID,便于问题追踪。
7. 总结
核心规则:
- 自主优化需禁用 LockAsync/UnlockAsync/Rename,并通过 pfnSetAsyncCallbacksCb 通知运行时。
- 严格遵循微软的优化禁用条件,除非获得特批。
性能与安全的平衡:多线程优化需以系统稳定性为前提,避免独占GPU资源。