0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

星星科技指导员 ? 来源:NVIDIA ? 作者:Louis Bavoil ? 2022-04-20 16:59 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

如何通过 PCIe 总线优化从 CPUGPU 的 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 数据:

poYBAGJfy1eAJ8cbAACa6E7DUpE334.png

图 1 直接从 DX12 上传堆获取 VB 。

来自系统内存的 L2 访问具有高延迟,因此最好在执行 draw 命令之前通过将数据从系统内存复制到 VRAM 来隐藏该延迟。

从 CPU 到 GPU 的预上载可以通过使用 copy 命令来完成,可以使用 COPY 队列异步完成,也可以在主直接队列上同步完成。

poYBAGJfy56AGJyaAAA-CsbwiLY489.png

图 2 使用 copy 命令将 VB 预加载到 VRAM

复制引擎可以在复制队列中与其他 GPU 工作同时执行复制命令,并且可以同时使用多个复制队列。但是,使用异步复制队列的一个问题是,您必须注意将队列与 DX12 Fences 同步,这可能很难实现,并且可能会有很大的开销。

在 GTC 2021 的 Nsight Graphics : GPU Trace 的下一级优化建议 会议上,我们宣布 NVIDIA GPU 上 DX12 应用程序的替代解决方案是有效地使用 CPU 线程作为复制引擎。这可以通过使用 NVAPI 在 CVV 中创建 DX12 上载堆来实现。 CPU 然后通过 PCIe 总线将写入此特殊上载堆的数据直接转发到 VRAM (图 3 )。

poYBAGJfy1iAOdMOAAB9auqoT8g282.png

图 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 后的帧的外观:

poYBAGJfy1mAR_KFAALR96_q8Rc811.png

图 4 带有颜色编码 GPU 工作负载的 GPU 跟踪分析工具

(越绿,帧上的预计增益越高)。

现在,选择帧末尾的用户界面绘制命令,分析工具显示,修复 二级未命中到系统内存 性能问题后 GPU 帧时间预计减少 0 。 9% 。该工具还显示,通过二级缓存传输的大多数系统内存流量是由基本引擎请求的,该引擎包括顶点属性获取单元:

poYBAGJfy2KAPj-gAAKq4djMzOs795.png

图 5 GPU 跟踪分析工具,关注单个工作负载。

通过在 CVV 中分配此 draw 命令的 VB ,而不是使用常规 DX12 上载堆分配系统内存,此机制的 GPU 时间从 0.2 ms 减少到 0.01 ms 以下。 GPU 帧时间也减少了 0.9% 。在此工作负载中, VB 数据现在直接从 VRAM 获取:

poYBAGJfy2SARVDtAAKr65sYXhE997.png

图 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 在放大一个代表性帧后显示的内容:

pYYBAGJfy2SASoxxAAEj2snqqqw207.png

图 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 线程活动开始相关:

pYYBAGJfy2WAbA_kAADI3HDLE9E352.png

图 8 Nsight Systems 显示了执行映射调用的 CPU 线程与对 BAR1 的 PCIe 读取请求之间的相关性,之后该相关性立即增加。

通过悬停在 CPU 线程下面的橙色采样点,您可以看到该线程正在执行一个名为 RenderCollectedTrees 的 C ++方法,这对查找正在进行 CVV 堆读/写操作的代码是有帮助的:

Nsight-systems-call-stack.png

图 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 游戏的生产价值。

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • NVIDIA
    +关注

    关注

    14

    文章

    5348

    浏览量

    106836
  • gpu
    gpu
    +关注

    关注

    28

    文章

    4979

    浏览量

    132080
  • WINDOWS
    +关注

    关注

    4

    文章

    3617

    浏览量

    91748
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    产品图片上传API接口

    ? 在电商平台、内容管理系统或移动应用中,产品图片上传API接口是核心功能之一。它允许用户或第三方应用通过HTTP请求图片文件上传到服务器,实现产品图像的快速添加和管理。本文逐步介
    的头像 发表于 07-25 14:30 ?177次阅读
    产品图片<b class='flag-5'>上传</b>API接口

    make sence成的XML文件能上传到自助训练模型上吗?

    make sence成的XML文件能上传到自助训练模型上吗
    发表于 06-23 07:38

    视频怎么上传到服务器?

    1.视频怎么上传到服务器 2.有什么办法把视频上传到网上,可以回看的?不用实时观看,只要回看
    发表于 06-18 06:42

    HarmonyOS优化应用预置图片资源加载耗时问题性能优化

    文件不会再打包到构建产物中,最后纹理文件和未转换的文件一起构建生成资源产物。 编译构建资源文件开启纹理压缩时序图如下: 三、场景案例 由于图片格式不能直接被GPU渲染,需要等待CP
    发表于 05-29 16:11

    提升AI训练性能:GPU资源优化的12个实战技巧

    在人工智能与机器学习技术迅速发展的背景下,GPU计算资源的高效利用已成为关键技术指标。优化的GPU资源分配不仅能显著提升模型训练速度,还能实现计算成本的有效控制。根据AI基础设施联盟2
    的头像 发表于 05-06 11:17 ?598次阅读
    提升AI训练性能:<b class='flag-5'>GPU</b><b class='flag-5'>资源</b>优化的<b class='flag-5'>12</b>个实战技巧

    可以手动构建imx-gpu-viv吗?

    使用 imx-gpu-viv-6.4.3.p4.2.aarch64.bin。 https://www.nxp.com/lgfiles/NMG/MAD/YOCTO//imx-gpu-viv-6.4.3.p4.2-aarch64.bin 我需要
    发表于 03-28 06:35

    DLP4500烧录,同样格式的图片(8bit),上传到第Index16时总是报错,为什么?

    我的DLP4500烧录总是出问题,同样格式的图片(8bit),上传到第Index16时总是报错“Error building firmware with XX.bmp -error code-8
    发表于 02-25 07:23

    GPU按需计费的优势

    GPU按需计费,是指用户根据实际使用的GPU资源和时间进行费用结算,而非传统的一次性购买或固定租赁模式。以下,是对GPU按需计费优势的总结,由AI部落小编整理。
    的头像 发表于 01-14 10:43 ?427次阅读

    GPU加速云服务器怎么用的

    GPU加速云服务器是GPU硬件与云计算服务相结合,通过云服务提供商的平台,用户可以根据需求灵活租用带有GPU资源的虚拟机实例。那么,
    的头像 发表于 12-26 11:58 ?516次阅读

    英特尔12月或发布Battlemage GPU芯片

    近日,有关英特尔即将在12月发布全新Battlemage GPU芯片的传闻再次被证实。据硬件挖掘者和泄密者Tomasz Gawrońsk分享的预告图显示,英特尔极有可能在AMD RDNA 4和英伟达Blackwell之前,率先推出其Battlemage
    的头像 发表于 11-19 17:37 ?876次阅读

    怎么把电表监测到的数据上传平台?

    在电力行业,很多电力仪表都需要具备4G通讯的功能,可以直接电表采集到的数据上传监测平台。这样就能在平台上清晰直观的看到电表监测的线路的三相电压、电流、频率、功率等电参量。所以,要把电表监测到的数据上传到平台上,就需要电表具有4
    的头像 发表于 11-12 14:52 ?758次阅读
    怎么把电表监测到的数据<b class='flag-5'>上传</b>平台?

    请问各位3256EVM-U通过麦克风采集到的数据能上传到电脑吗?

    请问各位,3256EVM-U通过麦克风采集到的数据能上传到电脑吗? 如果能,在电脑上用什么软件接收呢?
    发表于 11-07 07:32

    【「算力芯片 | 高性能 CPU/GPU/NPU 微架构分析」阅读体验】--了解算力芯片GPU

    每个CUDA单元在 OpenCL 编程框架中都有对应的单元。 倒金字塔结构GPU存储体系 共享内存是开发者可配置的编程资源,使用门槛较高,编程上需要更多的人工显式处理。 在并行计算架构中,线程
    发表于 11-03 12:55

    GPU算力租用平台是什么

    GPU算力租用平台是一种基于云计算的服务模式,它允许用户通过互联网按需租用高性能GPU资源,而无需自行购买、部署和维护这些硬件。
    的头像 发表于 10-16 10:15 ?762次阅读

    求助,如何将定制的2级引导加载程序上传到指定的2级引导区?

    如何将定制的 2 级引导加载程序上传到指定的 2 级引导区? 我的设备从 SPI 闪存启动。 在闪存中,2 级引导程序被写入地址 0x00000000,然后是应用固件。 因此,它遵循以下启动顺序
    发表于 09-26 06:54