一种基于热复用缓存池的Direct3DGPU内存高效管理方法与流程

摘要: 本发明属于计算机软件开发,具体涉及一种基于热复用缓存池的direct3dgpu内存高效管理方法。背景技术:1、基于vulkan的direct3d翻译层dxvk,...
一种基于热复用缓存池的Direct3DGPU内存高效管理方法与流程

本发明属于计算机软件开发,具体涉及一种基于热复用缓存池的direct3d gpu内存高效管理方法。

背景技术:

1、基于vulkan的direct3d翻译层dxvk,其核心功能是将d3d 9-11的显存管理逻辑如自动内存分配、资源优先级调度、动态预算适配等映射到vulkan的显式显存模型。d3d原生环境中,显卡驱动会实时提供显存预算、使用量及多进程占用状态,而dxvk依赖vk_ext_memory_budget扩展获取这些关键数据,该扩展通过硬件接口直接返回各内存堆的可用预算heapbudget、当前使用量heapusage及动态变化信息,是dxvk实现d3d显存逻辑映射的核心支撑。

2、当gpu不支持该扩展时,dxvk会面临的很多现有技术难以解决的技术难点,包括:一是d3d显存模型映射断层,d3d的自动预算适配逻辑难以实现,dxvk只能基于内存堆总容量静态估算,导致过度分配崩溃如忽略其他进程占用或过度保守卡顿如预留过多显存导致资源频繁卸载等;二是多进程显存竞争感知失效,linux系统中图形合成器compositor如kwin、gnome shell,后台视频渲染如ffmpeg等进程会动态占用显存,但dxvk无法区分游戏自身显存需求增长与外部进程抢占,易误判内存压力来源,导致错误回收关键渲染资源,如玩家视角内的纹理;三是显存性能开销失控,现有分配失败后回收的事后策略,会导致渲染管线中断,且静态优先级回收如固定为纹理的优先级高于缓冲区的优先级,无法适配游戏动态场景如战斗场景中缓冲区需求激增,进一步加剧性能波动;四是d3d资源生命周期失配,d3d通过引用计数及驱动级缓存的管理资源生命周期,而无vk_ext_memory_budget时dxvk无法精准判断资源是否即将复用,导致提前回收需重新加载或延迟释放占用显存的矛盾。

技术实现思路

1、有鉴于此,本发明提供一种基于热复用缓存池的direct3d gpu内存高效管理方法,通过构建dxvk用户态热复用缓存池,用于托管高频复用的gpu内存资源块,与内核侧存储硬件与堆统计信息的专用共享缓存池相互配合,在gpu不支持vk_ext_memory_budget扩展的跨进程场景下,由dxvk翻译层实现了d3d应用相关gpu内存的高效管控。

2、本发明提供的一种基于热复用缓存池的direct3d gpu内存高效管理方法,具体包括以下步骤:

3、当gpu不支持vk_ext_memory_budget扩展时,d3d应用创建设备阶段,dxvk初始化vulkan实例并在用户态建立独立热复用缓存池,采集gpu硬件与内核堆属性写入内核专用缓存池并完成映射;遍历占用gpu内存的进程,生成gpu内存基线,构建d3d内存类型、vulkan内存类型、内核堆id映射表;计算并调整内核堆基础预算,预估堆模拟使用量与可用预算余量,余量不足时触发轻度回收;

4、创建d3d资源时,dxvk提取资源属性得到优先级评分,查询映射表确定首选内核堆,读取堆实时数据计算负载评分,结合空闲块、可用预算余量评估gpu内存状态;检索热复用缓存池,命中匹配内存块则直接复用,未命中则分配gpu内存并返回资源句柄;

5、渲染阶段启用分级监控线程采集gpu内存数据,识别内存异常并预警;按进程干扰程度分类计算干扰指数,高干扰场景根据竞争源执行差异化管控;依据解压缩次数、间隔区分高低复用压缩资源并配置释放策略;采用环形缓冲区维护资源访问轨迹,基于轨迹加权更新资源优先级;资源复用时更新轨迹,对高复用压缩资源执行解压与参数重置;高复用内存块保留于热复用缓存池,冷资源移出标记为可回收,同步更新预算模型;基于多指标加权计算压力得分判定压力等级,等级切换时通知对应线程,调控渲染流程与预分配池;dxvk进程退出时执行用户态与内核态清理。

6、进一步地,所述遍历占用gpu内存的进程,生成gpu内存基线的方式为:遍历占用gpu内存的进程,标识其进程身份包括桌面合成器进程及后台视频渲染进程,获取其已分配容量、已锁定容量及可释放容量;计算gpu内存基线包括全局已用gpu内存、全局空闲gpu内存及关键进程占用比,其中,全局已用gpu内存为所有进程的已分配容量之和与所有进程的可释放容量之和的差值,全局空闲gpu内存为所有内核堆的总容量与全局已用gpu内存的差值,关键进程占用比为桌面合成器进程及后台视频渲染进程的已分配容量之和与全局已用gpu内存的比值。

7、进一步地,所述计算并调整内核堆基础预算的方式为:对于device_local堆,基础预算等于堆总容量乘以第一比例,若显存类型为lpddr5则基础预算等于堆总容量乘以第二比例;对于host_visible堆,基础预算等于堆总容量乘以第三比例,若堆总容量小于等于阈值,则基础预算等于堆总容量乘以第四比例;若gpu支持显存压缩,则对上述得到的基础预算统一上调设定比例。

8、进一步地,所述dxvk提取资源属性得到优先级评分的方式为:根据提取的访问频率、生命周期及视觉影响的实际情况,按照预设规则确定访问频率分、生命周期分及视觉影响分,再对访问频率分、生命周期分及视觉影响分加权求和得到优先级评分。

9、进一步地,所述读取堆实时数据计算负载评分的方式为:将堆已用容量与堆可释放容量的差值与堆总容量的比值作为使用率,根据使用率的取值范围确定使用率分;将堆总容量与堆最大空闲块大小的差值与堆总容量的比值作为碎片率,根据碎片率的取值范围确定碎片率分;根据访问延迟的取值范围确定访问延迟分;最后由使用率分、碎片率分和访问延迟分加权求和得到负载评分。

10、进一步地,若首选内核堆的负载评分小于阈值,则直接在其中为待创建d3d资源分配底层gpu内存;否则,查询与首选内核堆具有相同堆类型、支持待创建资源类型且负载评分小于阈值的兼容内核堆,若存在则在该兼容内核堆中为待创建资源分配底层gpu内存并记录跨堆分配的资源信息,若不存在则在首选内核堆中分配并触发首选内核堆的碎片整理预告。

11、进一步地,dxvk提取场景特征包括帧类型、资源需求趋势、时间戳及资源类型占比,计算历史场景库中场景特征与提取的场景特征的欧氏距离,选取距离最小的场景特征作为匹配结果,确定当前场景类型进行匹配,其中,历史场景库为基于多款应用的场景数据构建的用于存储场景特征到资源需求模型映射关系的数据库;

12、dxvk依据匹配得到的场景类型设定预分配比例,计算预分配容量并设置分配约束;根据当前场景的资源类型占比选定预分配对应的内存类型与内核堆,在预分配内存池中分配预分配容量,并设置预分配标识及过期时间;下一帧收到资源分配请求时,优先从预分配内存池获取gpu内存块,并标记该gpu内存块为已使用,每帧执行完毕后清理预分配池内过期未使用gpu内存块。

13、进一步地,所述分级监控线程包括用于监控高优先级资源占用量、内核堆使用率、gpu内存控制器实时带宽占用、绑定资源冲突状态的一级监控线程,用于监控中优先级资源占用量、gpu共享内存堆使用率、跨进程gpu内存占用总量、预分配池使用率的二级监控线程,用于监控低优先级资源占用量、gpu内存碎片率、内核元数据完整性、压缩资源状态的三级监控线程,一级监控线程为实时优先级,二级监控线程为普通优先级,三级监控线程为低优先级,将一级监控线程与d3d应用的渲染线程绑定,仅在cpu空闲时调度执行二、三级监控线程。

14、进一步地,所述高干扰场景根据竞争源执行差异化管控的方式为:若最大竞争源为视频渲染进程,则dxvk发送显存限制请求触发内核限制该进程对gpu内存的使用;若最大竞争源为3d应用进程,则dxvk临时下调非关键资源优先级,并执行轻度回收;若最大竞争源为系统进程,则dxvk触发纹理分辨率动态降级。

15、进一步地,在d3d应用录制渲染指令、使用资源句柄将资源绑定到渲染管线时,dxvk执行资源绑定操作过程中,检查资源的gpu内存分配状态,若为未分配则触发紧急gpu内存分配;检查gpu锁定状态,若资源正在被gpu访问则设置超时时间等待访问结束;检查数据同步状态,当资源为cpu与gpu的共享资源时,检查cpu是否修改了数据,若已修改则将cpu修改的数据同步到gpu;若为压缩资源,则将资源解压到gpu内存;

16、遍历当前命令缓冲区中已绑定的资源,若存在两个不同资源同时写入和读取的内存地址,则当两个资源优先级不同时优先将较低优先级的资源从该内存地址解绑,当两个资源优先级相同时将其中任一资源的绑定操作延迟到下一个命令缓冲区执行,并记录绑定信息及访问类型;

17、当gpu负载大于阈值时,将优先级低于阈值资源延迟到vulkan绘制命令执行前的设定时间内完成批量绑定。

18、有益效果:

19、本发明在 d3d 应用创建设备阶段完成硬件参数采集、内核堆数据同步、内存映射关系构建与预算模型初始化;在资源创建阶段结合资源优先级、内核堆负载与显存状态智能分配内存,并优先复用热复用缓存池内的常驻内存块;在持续渲染阶段通过三级分级监控识别显存异常与跨进程内存竞争,区分高、低复用压缩资源,依托资源访问轨迹动态更新资源热度,将高热度资源常驻热复用缓存池、低热度资源移出回收,实现显存资源冷热分层管理;通过多维度指标加权计算显存压力得分并分级调控渲染流程与预分配策略;进程退出时完成用户态热缓存资源清理与内核态全局显存数据同步,实现了跨进程场景下不依赖vk_ext_memory_budget扩展的d3d应用相关gpu显存管控,大幅提升 d3d 模拟层 gpu 内存复用率与整体调度效率。