如何使用NVAPI将DX12资源上传到GPU

如何通过 pcie 总线优化从 cpu 到 gpu 的 dx12 资源上传是一个老问题,有许多可能的解决方案,每个解决方案都有其优缺点。在这篇文章中,我将展示如何使用 nvapi 将 dx12 上传堆移动到 cpu-visible vram ( cvv ),这是一个加速 pcie 有限工作负载的简单解决方案。
cpu-visible vram :工具箱中的新工具
以顶点缓冲区( vb )上载为例,数据不能跨帧重用。将 vb 上载到 gpu 的最简单方法是直接从 gpu 读取 cpu 内存:
首先,应用程序创建 dx12 upload 堆或等效的 custom 堆。 dx12 上传堆分配在系统内存中,也称为 cpu 内存,其中 write_combine ( wc )页面针对 cpu 写入进行了优化。 cpu 首先将 vb 数据写入此系统内存堆。
其次,应用程序使用 iasetvertexbuffers 命令将上载堆中的 vb 绑定到 gpu draw 命令。
在 gpu 中执行绘制时,将启动顶点着色器。接下来,顶点属性提取( vaf )单元通过 gpu 的二级缓存读取 vb 数据,二级缓存本身从存储在系统内存中的 dx12 上载堆加载 vb 数据:
图 1 直接从 dx12 上传堆获取 vb 。
来自系统内存的 l2 访问具有高延迟,因此最好在执行 draw 命令之前通过将数据从系统内存复制到 vram 来隐藏该延迟。
从 cpu 到 gpu 的预上载可以通过使用 copy 命令来完成,可以使用 copy 队列异步完成,也可以在主直接队列上同步完成。
图 2 使用 copy 命令将 vb 预加载到 vram
复制引擎可以在复制队列中与其他 gpu 工作同时执行复制命令,并且可以同时使用多个复制队列。但是,使用异步复制队列的一个问题是,您必须注意将队列与 dx12 fences 同步,这可能很难实现,并且可能会有很大的开销。
在 gtc 2021 的 nsight graphics : gpu trace 的下一级优化建议 会议上,我们宣布 nvidia gpu 上 dx12 应用程序的替代解决方案是有效地使用 cpu 线程作为复制引擎。这可以通过使用 nvapi 在 cvv 中创建 dx12 上载堆来实现。 cpu 然后通过 pcie 总线将写入此特殊上载堆的数据直接转发到 vram (图 3 )。
图 3 在 cpu 线程中使用 cpu 写操作将 vb 预加载到 vram
对于 dx12 ,以下 nvapi 函数可用于查询系统中可用的 cvv 量,并用于分配这种新风格的堆( cpu – 可写 vram ,具有快速 cpu 写入和慢速 cpu 读取):
nvapi_d3d12_querycpuvisiblevidmem
nvapi_d3d12_createcommittedresource
nvapi_d3d12_createheap2
这些新功能需要最新的驱动程序: 466 。 11 或更高版本。
nvapi_d3d12_querycpuvisiblevidmem 应报告以下 cvv 内存量:
使用 windows 11 (例如,使用 windows11 内幕预览 )时 nvidia rtx 20xx 和 30xx gpu s 的容量为 200-256 mb 。
可调整大小的条_ rtx 30xx gpu s 在 windows 10 或 windows 11 中超过 256 mb ,且 nvidia 控制面板中的 可调整大小的条_ 报告为 nvidia 。有关如何启用可调整大小栏的更多信息,请参阅 geforce rtx 30 系列通过可调整大小的杆支撑加速性能 。
使用 nsight graphics 从 cpu-visible vram 检测并量化 gpu 性能增益机会
nvidia nsight 图形 2021 。 3 中的 gpu 跟踪工具可轻松检测 gpu 性能提升机会。启用 高级模式 时, gpu 内的 analysis 面板将根据预测的帧减少百分比,通过修复此 gpu 工作负载中的特定问题,跟踪帧内的颜色代码 perf 标记。
以下是在 rtx nvidia 3080 上,从 看门狗:军团 ( dx12 )预发布版本中选择 analyze 后的帧的外观:
图 4 带有颜色编码 gpu 工作负载的 gpu 跟踪分析工具
(越绿,帧上的预计增益越高)。
现在,选择帧末尾的用户界面绘制命令,分析工具显示,修复 二级未命中到系统内存 性能问题后 gpu 帧时间预计减少 0 。 9% 。该工具还显示,通过二级缓存传输的大多数系统内存流量是由基本引擎请求的,该引擎包括顶点属性获取单元:
图 5 gpu 跟踪分析工具,关注单个工作负载。
通过在 cvv 中分配此 draw 命令的 vb ,而不是使用常规 dx12 上载堆分配系统内存,此机制的 gpu 时间从 0.2 ms 减少到 0.01 ms 以下。 gpu 帧时间也减少了 0.9% 。在此工作负载中, vb 数据现在直接从 vram 获取:
图 6 gpu 跟踪分析工具,在优化了工作负载之后。
使用 nsight 系统避免 cpu 读取 cpu – 可见 vram
cpu 不应读取常规 dx12 上载堆,而应仅将其写入。与常规堆一样, cvv 堆的 cpu 内存页已启用 写合并 。这提供了快速的 cpu 写入性能,但缓慢的非缓存 cpu 读取性能。此外,由于从 cvv 读取 cpu 会通过 pcie 、 gpu l2 和 vram 进行往返,因此从 cvv 读取的延迟远大于从常规 dx12 上载堆读取的延迟。
要检测应用程序 cpu 的性能是否受到来自 cvv 的 cpu 读取的负面影响,并获取 cpu 调用导致这种情况的信息,我建议使用 nsight 系统 2021.3 。
示例 1 : cvv cpu 读取 readfromsubresource
下面是一个在 nsight 系统跟踪中从 dx12 readfromsubresource 读取灾难性 cpu 的示例。为了捕获此跟踪,在获取跟踪时,我在 nsight 系统项目配置中启用了新的 收集 gpu 指标 选项,以及默认设置,其中包括 样本目标过程 。
以下是 nsight systems 在放大一个代表性帧后显示的内容:
图 7 nsight 系统显示 2 。 6 ms readfromsubresource 调用与来自 bar1 的高 pcie 读取请求计数相关的 cpu 线程。
在这种情况下(单个 – gpu 机器), nsight systems 中的 对 bar1 的 pcie 读取请求 gpu 指标测量发送到 pcie 的 cpu 读取请求数,以获取 cvv ( bar1 )中分配的资源。 nsight systems 显示 cpu 线程上的长 dx12 readfromsubresource 调用与来自 cvv 的大量 pcie 读取请求之间存在明显的相关性。因此,您可以得出结论,此调用很可能是从 cvv 执行 cpu 回读,并在应用程序中修复此问题。
示例 2 : cvv cpu 从映射指针读取
cpu 从 cvv 读取的数据不限于 dx12 命令。当使用 dx12 资源映射调用返回的任何 cpu 内存指针时,它们可能发生在任何 cpu 线程中。这就是为什么建议使用 nsight 系统对其进行调试,因为除了选定的 gpu 硬件指标外, nsight 系统还可以定期对每个 cpu 线程的调用堆栈进行采样。
以下是 nsight 系统的一个示例,其中显示了从 cvv 进行的 cpu 读取与没有 dx12 api 调用相关,但与 cpu 线程活动开始相关:
图 8 nsight systems 显示了执行映射调用的 cpu 线程与对 bar1 的 pcie 读取请求之间的相关性,之后该相关性立即增加。
通过悬停在 cpu 线程下面的橙色采样点,您可以看到该线程正在执行一个名为 rendercollectedtrees 的 c ++方法,这对查找正在进行 cvv 堆读/写操作的代码是有帮助的:
图 9 nsight systems 显示 cpu 线程的调用堆栈采样点,该线程与对 bar1 的高 pcie 读取请求相关。
在这种情况下,提高性能的一种方法是对 cpu 内存的单独块执行读/写访问,而不是在 dx12 上载堆中。完成所有读/写更新后,从 cpu 读/写内存向上载堆执行 memcpy 调用。
结论
在 windows 11 pc 上运行的所有 pc 游戏都可以在 nvidia rtx 20xx 和 30xx gpu s 上使用 256 mb 的 cvv 。 nvapi 可用于查询系统中可用 cvv 内存的总量,并在此空间中分配 dx12 内存。如果 cpu 从未从原始 dx12 上载堆读取数据,则只需更改分配堆的代码即可将 dx12 上载堆替换为 cvv 堆。
要检测将 dx12 上载堆移动到 cvv 时 nsight 图形 的性能提升机会,建议使用 gpu 中的 gpu 跟踪分析工具。要检测和调试从 cvv 读取 cpu 时的性能损失,我建议在启用 gpu 指标的情况下使用 nsight 系统 。
关于作者
louis bavoil 自 2007 年以来一直在 nvidia 的开发者技术小组工作,从事 gpu 性能优化和 gameworks 软件开发的混合工作,目标是帮助提高 pc 游戏的生产价值。


不想告别Flash?教你如何继续使用Flash
伴随音乐节奏驾驶!
免疫层析真菌毒素检测仪对于食品安全发挥着重要作用
科大讯飞发布新款智能鼠标 售价299元起
广西科林大疆半导体封装检测产业园项目开工 投资约2亿元
如何使用NVAPI将DX12资源上传到GPU
云计算和分布式计算有何区别?
华为石墨烯电池原理揭秘,看华为专利有多牛?
周航加盟小米系, 与易到反目
骨传导耳机用于跑步时感觉如何?最适合跑步用的骨感耳机
耦合器使用中的常见故障有哪些?
LCD与OLED对比差距到底有多大?
大立光成为全球光学产业最神秘的黑匣子
英特尔推出深度学习加速器和新一代至强芯片
什么是应力腐蚀?应力腐蚀发生的条件
【机器视觉】欢创播报 | 华为正式发布智界S7
DS1859数控电阻与MAX3735激光驱动器接口
企业AI为CIO提供了一个难得的机会
“6个新”使万物互联 开启智慧物联网2.0时代
小米MIX、华为mate9分分入选目前最难买到的五部手机,你入手了谁?