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

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

http://www.xdnf.cn/news/10470.html

相关文章:

  • 使用 So-VITS-SVC 实现明星声音克隆与视频音轨替换实战全流程
  • 云部署实战:基于AWS EC2/Aliyun ECS与GitHub Actions的CI/CD全流程指南
  • SpringBoot-配置Spring MVC
  • 学习经验分享【40】目标检测热力图制作
  • 基于SpringBoot运动会管理系统设计和实现(源码+文档+部署讲解)
  • CppCon 2014 学习:Decomposing a Problem for Parallel Execution
  • 详解|证券、基金、期货:银证转账系统
  • 监控 100 台服务器磁盘内存CPU利用率
  • 赛事获奖|TsingtaoAI荣获“雄才杯”2025创新创业大赛总决赛奖项
  • 调用蓝耘API打造AI 智能客服系统实践教程
  • 对抗攻击 Adversarial Attack
  • 【MySQL基础】库的操作:创建、删除与管理数据库
  • 【Part 3 Unity VR眼镜端播放器开发与优化】第二节|VR眼镜端的开发适配与交互设计
  • 电脑故障基础知识
  • docker-部署Nginx以及Tomcat
  • OpenCV——Mac系统搭建OpenCV的Java环境
  • 一键开关机电路分析
  • python第39天打卡
  • 网页前端开发(基础进阶2--JS)
  • 【Day42】
  • 常量指真,指针常量 ,
  • 如何通过 Makefile 向源代码传递变量值
  • 实验:基于SpringBoot+MyBatis-Plus实现文章列表增删改查
  • vue3(入门,setup,ref,计算属性,watch)
  • c++学习之---模版
  • JavaScript 模块系统:CJS/AMD/UMD/ESM
  • 使用 DeepSeek API 搭建智能体《无间》- 卓伊凡的完整指南 -优雅草卓伊凡
  • C语言基础(09)【数组的概念 与一维数组】
  • day03-Vue-Element
  • 临界区保护