window 显示驱动开发-分页视频内存资源

news2025/5/17 13:30:58

与 Microsoft Windows 2000 显示驱动程序模型不同,Windows Vista 显示驱动程序模型允许创建比可用物理视频内存总量更多的视频内存资源,然后根据需要分页进出视频内存。 换句话说,并非所有视频内存资源都同时位于视频内存中。

GPU 的管道中可以有多个 DMA 缓冲区。 这些活动 DMA 缓冲区引用的视频内存资源必须位于视频内存中。 其他空闲视频内存资源可以分页到系统内存。

在 GPU 计划程序调用显示微型端口驱动程序的 DxgkDdiSubmitCommand 函数以将 DMA 缓冲区提交到 GPU 之前,计划程序必须确保 DMA 缓冲区使用的所有视频内存资源实际上都在视频内存中。 如果某些资源不在视频内存中,则必须从系统内存中分页。 GPU 计划程序必须调用视频内存管理器来查找视频内存中的空间,以便将必要的视频内存资源数据从系统内存传输到视频内存。 当视频内存需求较高时,GPU 计划程序必须调用视频内存管理器,以将空闲视频内存资源数据传输到系统内存,以便为所需的视频内存资源数据腾出空间。 包含用于在视频和系统内存之间传输数据的命令的特殊用途 DMA 缓冲区称为分页缓冲区。 视频内存管理器调用显示微型端口驱动程序的 DxgkDdiBuildPagingBuffer 函数来创建分页缓冲区,驱动程序将硬件特定的数据传输命令写入该缓冲区。

1. 内存虚拟化架构对比

Windows 2000 (XPDM) 模型

  1. 静态分配:资源一旦创建即永久占用显存
  2. 硬性限制:总资源大小 ≤ 物理显存容量
  3. 问题:多应用竞争显存时需频繁切换上下文

Windows Vista+ (WDDM) 模型

  1. 虚拟化池:所有应用共享的虚拟显存空间(物理显存 + 系统内存)
  2. 按需分页:仅活跃资源占用物理显存
  3. 优势:支持的总资源量 >> 物理显存容量

2. 关键组件协作流程

(1) 分页触发条件
当 GPU 调度器准备提交 DMA 缓冲区时:

BOOL CheckResourceResidency(DMA_BUFFER* dmaBuffer) {
    foreach (Resource* res in dmaBuffer->ReferencedResources) {
        if (!res->IsResidentInVRAM()) {  // 检查物理显存驻留
            TriggerPaging(res);          // 触发分页操作
            return FALSE;
        }
    }
    return TRUE;
}

(2) 分页缓冲区构建

(3) 分页缓冲区示例内容

// AMD GPU 的分页命令示例
struct PAGE_COMMAND {
    uint64_t srcSysMemAddr;  // 系统内存源地址
    uint64_t dstVramAddr;    // 显存目标地址
    uint32_t size;           // 传输数据大小
    uint32_t tilingFlags;    // 块状排列参数
};

void BuildPagingBuffer(PAGE_COMMAND* buffer, Resource* res) {
    buffer->srcSysMemAddr = res->sysMemBacking;
    buffer->dstVramAddr = VidMmAllocVram(res->size);
    buffer->size = res->size;
    buffer->tilingFlags = res->tilingMode;
}

3. 内存管理策略

(1) 驻留集管理

  • 活动集(Working Set):当前 DMA 缓冲区引用的资源必须驻留
  • LRU 策略:非活跃资源按最近使用时间排序逐出
void VidMmEvictResources(uint64_t requiredSize) {
    while (freeVram < requiredSize) {
        Resource* victim = FindLRUResource();
        CopyToSystemMemory(victim);  // 回写系统内存
        FreeVram(victim->vramAddr);
    }
}

(2) 并发控制
栅栏(Fence)同步:确保分页操作完成前 GPU 不访问资源

void SubmitPagingBuffer(DMA_BUFFER* pagingBuf) {
    uint64_t fenceVal = InsertFence();
    QueueToGpu(pagingBuf, fenceVal);
    WaitForFence(fenceVal);  // 等待传输完成
}

4. 开发者注意事项

用户模式驱动(UMD)

// 创建资源时应考虑分页开销
HRESULT CreateTexture(UINT size, bool isFrequentlyUsed) {
    D3DDDI_ALLOCATIONINFO info = {0};
    if (isFrequentlyUsed) {
        info.Flags.PreferContiguous = 1;  // 提示VidMm优先驻留
    }
    return pfnAllocateCb(&info);
}

内核模式驱动(KMD)

// 必须正确处理分页失败
NTSTATUS DxgkDdiBuildPagingBuffer(
    IN_PDXGKARG_BUILDPAGINGBUFFER pArgs)
{
    if (!CheckHwCapability(pArgs->SizeRequired)) {
        return STATUS_GRAPHICS_INSUFFICIENT_DMA_BUFFER;
    }
    // ...生成硬件命令
}

5. 性能优化技巧

技术适用场景实现方式
预加载(Preload)关键帧资源加载在Present前异步提交分页请求
批量传输大量小资源迁移合并多个资源到单个分页缓冲区
压缩分页带宽受限系统实现驱动级内存压缩/解压
智能驻留开放世界游戏地形使用D3DDDI_ALLOCATIONFLG_PERSISTENT标记

6. 调试与问题排查

常见问题症状

  1. GPU 挂起:分页操作未完成导致依赖等待
  2. 帧率骤降:频繁分页引发带宽瓶颈
  3. 纹理闪烁:分页同步错误导致部分更新

诊断工具

# Windows Performance Analyzer (WPA)
wpaexporter.exe -d Graphics.gpuperf -o trace.csv

# WinDbg 命令
!dxgkd_ext.vidmm -stats  # 显示内存分布统计
!dxgkd_ext.resource 0xADDR  # 检查资源状态

演进与现状
Windows 10+ 改进:

  1. 内存优先级:支持资源优先级分层管理
  2. 直接存储:绕过CPU直接分页(GPU←→NVMe)
  3. UMA优化:统一内存架构下的零拷贝分页

开发者适配建议:

// 使用DX12内存池提示
D3D12_HEAP_PROPERTIES heapProps = {
    .Type = D3D12_HEAP_TYPE_DEFAULT,
    .CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_NOT_AVAILABLE,
    .MemoryPoolPreference = D3D12_MEMORY_POOL_L1  // 显存优先
};

WDDM 的内存虚拟化机制通过精细的分页策略和硬件加速,实现了 GPU 内存资源的弹性管理,为现代图形应用提供了更大的资源池和更高的内存利用率,同时也对驱动开发者的内存管理能力提出了更高要求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2377697.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【笔记】记一次PyCharm的问题反馈

#工作记录 最近更新至 PyCharm 社区版的最新版本后&#xff0c;我遇到了多个影响使用体验的问题。令人感到不便的是&#xff0c;一些在旧版本中非常便捷的功能&#xff0c;在新版本中却变得操作复杂、不够直观。过去&#xff0c;我一直通过 PyCharm 内置的故障报告与反馈机制反…

uniapp中vue3和pinia安装依赖npm install失败

目录 一、问题描述 二、问题原因 三、问题解析及解决方案 一、问题描述 用uni-app开发小程序的时候&#xff0c;使用了vue3pinia,安装依赖的时候发现vue和pinia的版本问题&#xff0c;安装失败&#xff0c; npm ERR! code ERESOLVE npm ERR! ERESOLVE could not resolve np…

DBF Converter:高效转换DBF文件,满足多样化数据处理需求

DBF Converter 是一款功能强大的数据转换工具&#xff0c;专为需要将DBF文件转换为其他格式的用户设计。它支持将DBF文件转换为CSV、Excel、HTML、SQL等多种常见格式&#xff0c;满足用户在不同场景下的数据处理需求。无论是数据迁移、报表生成还是日常数据处理&#xff0c;DBF…

Jmeter 安装包与界面汉化

Jmeter 安装包&#xff1a; 通过网盘分享的文件&#xff1a;CSDN-apache-jmeter-5.5 链接: https://pan.baidu.com/s/17gK98NxS19oKmkdRhGepBA?pwd1234 提取码: 1234 Jmeter界面汉化&#xff1a;

【C++】 —— 笔试刷题day_29

一、排序子序列 题目解析 一个数组的连续子序列&#xff0c;如果这个子序列是非递增或者非递减的&#xff1b;这个连续的子序列就是排序子序列。 现在给定一个数组&#xff0c;然后然我们判断这个子序列可以划分成多少个排序子序列。 例如&#xff1a;1 2 3 2 2 1 可以划分成 …

MongoTemplate 基础使用帮助手册

前言 MongoDB 是一种流行的 NoSQL 数据库&#xff0c;适合存储大量的非结构化数据。MongoTemplate 是 Spring Data MongoDB 中的一个核心组件&#xff0c;它提供了一组丰富的 API 来与 MongoDB 进行交互。它封装了许多常见的数据库操作&#xff0c;使开发者能够轻松执行 CRUD 操…

图像处理:预览并绘制图像细节

前言 因为最近在搞毕业论文的事情&#xff0c;要做出一下图像细节对比图&#xff0c;所以我这里写了两个脚本&#xff0c;一个用于框选并同时预览图像放大细节&#xff0c;可显示并返回框选图像的坐标&#xff0c;另外一个是输入框选图像的坐标并将放大的细节放置在图像中&…

力扣热题——最长相邻不相等子序列 |

题目要求从字符串数组 words 中选出一个最长的子序列&#xff0c;使得该子序列中相邻字符串对应的 groups 数组中的值不同。通过贪心算法&#xff0c;可以高效地解决该问题。具体步骤为&#xff1a;初始化一个结果列表&#xff0c;遍历 words 数组&#xff0c;检查当前字符串的…

ssti刷刷刷

[NewStarCTF 公开赛赛道]BabySSTI_One 测试发现过滤关键字&#xff0c;但是特殊符号中括号、双引号、点都能用 可以考虑拼接或者编码&#xff0c;这里使用拼接 ?name{{()["__cla"~"ss__"]}}?name{{()["__cla"~"ss__"]["__ba&…

java+selenum专题(一)

环境搭建部署篇-> 1.简介 java版的selenium&#xff0c;介绍一下java selenium自动化测试。大致和pythonselenium自动化测试差不多。基于java和selenium做自动化测试&#xff0c;因此你必须会搭建基本的开发环境&#xff0c;掌握python基本的语法和一个IDE来进行开发&…

[逆向工程]DebugView捕获WPS日志?解析未运行WPS时Shell扩展加载的原因与解决方案(二十五)

[逆向工程]DebugView捕获WPS日志&#xff1f;解析未运行WPS时Shell扩展加载的原因与解决方案&#xff08;二十五&#xff09; 引言&#xff1a;一个“幽灵”般的日志问题 你是否在使用 DebugView 排查系统问题时&#xff0c;发现日志中频繁出现 WPS 相关模块&#xff08;如 k…

ACM模式用Scanner和System.out超时的解决方案和原理

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;笔试强训 &#x1f4da;本系列文章为个人学…

Java注解详解:从入门到实战应用篇

1. 引言 Java注解&#xff08;Annotation&#xff09;是JDK 5.0引入的一种元数据机制&#xff0c;用于为代码提供附加信息。它广泛应用于框架开发、代码生成、编译检查等领域。本文将从基础到实战&#xff0c;全面解析Java注解的核心概念和使用场景。 2. 注解基础概念 2.1 什…

QML 属性动画、行为动画与预定义动画

目录 引言相关阅读本文使用的动画属性工程结构示例解析示例1&#xff1a;属性动画应用示例2&#xff1a;行为动画实现示例3&#xff1a;预定义动画 总结工程下载 引言 QML动画系统为界面元素提供了流畅的过渡效果。本文通过三个示例&#xff0c;结合属性动画(PropertyAnimatio…

window nvidia-smi命令 Failed to initialize NVML: Unknown Error

如果驱动目录下的可以执行&#xff0c;那可能版本原因 "C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi"复制"C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi.exe"替换 C:\Windows\System32\nvidia-smi.exe 或者 把C:\Windows\System3…

自学嵌入式 day19-数据结构 链表

二、线性表的链式存储 1.特点&#xff1a; &#xff08;1&#xff09;线性表链式存储结构的特点是一组任意的存储单位存储线性表的数据元素&#xff0c;存储单元可以是连续的&#xff0c;也可以不连续。可以被存储在任意内存未被占用的位置上。 &#xff08;2&#xff09;所以…

东芝第3代SiC MOSFET助于降低应用中电源损耗

功率器件是管理和降低各种电子设备电能功耗以及实现碳中和社会的重要元器件。由于与比硅材料相比&#xff0c;碳化硅具有更高的电压和更低的损耗&#xff0c;因此碳化硅&#xff08;SiC&#xff09;被广泛视为下一代功率器件的材料。虽然碳化硅功率器件目前主要用于列车逆变器&…

PD 分离推理的加速大招,百度智能云网络基础设施和通信组件的优化实践

为了适应 PD 分离式推理部署架构&#xff0c;百度智能云从物理网络层面的「4us 端到端低时延」HPN 集群建设&#xff0c;到网络流量层面的设备配置和管理&#xff0c;再到通信组件和算子层面的优化&#xff0c;显著提升了上层推理服务的整体性能。 百度智能云在大规模 PD 分离…

官方 Elasticsearch SQL NLPChina Elasticsearch SQL

官方的可以在kibana 控制台上进行查询&#xff1a; POST /_sql { “query”: “SELECT client_ip, status FROM logs-2024-05 WHERE status 500” } NLPChina Elasticsearch SQL就无法以在kibana 控制台上进行查询&#xff0c;但是可以使用postman接口进行查询&#xff1a;

5月16日复盘-目标检测开端

5月16日复盘 一、图像处理之目标检测 1. 目标检测认知 ​ Object Detection&#xff0c;是指在给定的图像或视频中检测出目标物体在图像中的位置和大小,并进行分类或识别等相关任务。 ​ 目标检测将目标的分割和识别合二为一。 ​ What、Where 2. 使用场景 目标检测用于…