当前位置: 首页 > news >正文

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资源。

相关文章:

  • 使用 So-VITS-SVC 实现明星声音克隆与视频音轨替换实战全流程
  • Kotlin 中 companion object 扩展函数详解
  • ShenNiusModularity项目源码学习(33:ShenNius.Admin.Mvc项目分析-18)
  • 力扣HOT100之动态规划:32. 最长有效括号
  • leetcode90.子集II:排序与同层去重的回溯优化策略
  • Java后端优化:对象池模式解决高频ObjectMapper实例化问题及性能影响
  • 玩客云 OEC/OECT 笔记(2) 运行RKNN程序
  • 华为云Flexus+DeepSeek征文|利用华为云 Flexus 云服务一键部署 Dify 平台开发文本转语音助手全流程实践
  • py爬虫的话,selenium是不是能完全取代requests?
  • 【Day43】
  • 链式前向星图解
  • 06.MySQL数据库操作详解
  • Elasticsearch 读写流程深度解析
  • 相机--相机标定
  • mac安装brew时macos无法信任ruby的解决方法
  • Qt OpenGL 相机实现
  • 无他相机:专业摄影,触手可及
  • 排序算法C语言实现
  • flutter开发安卓APP适配不同尺寸的手机屏幕
  • FreeBSD 14.3 候选版本附带 Docker 镜像和关键修复
  • 前端可以自己做网站么/百度竞价登陆
  • 网站开发进度报告/深圳品牌seo
  • 晚上必看的正能量网站app/seo优化网络公司排名
  • 怎样自己做刷赞网站/六年级下册数学优化设计答案
  • wordpress位置/武汉关键词seo排名
  • 集美区网站建设/上海十大营销策划公司