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

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

3天内不再提示

NVIDIA GPUs上命令缓冲区的应用实践

星星科技指导员 来源:NVIDIA 作者:Wessam Bahnassi 2022-04-15 17:05 次阅读

这篇文章介绍了 NVIDIA GPUs 上命令缓冲区的最佳实践。要在应用程序中获得高且一致的帧速率,请参阅所有高级 API 性能提示。

命令缓冲区是从 CPU 发送要在 GPU 上执行的命令的主要机制。通过遵循本文列出的最佳实践,您可以通过最大化并行性、避免瓶颈和减少 GPU 上的空闲时间,在 CPU 和 GPU 上实现性能提升。

推荐

接受您负责实现和控制 GPU / CPU 并行性的事实。

向命令列表提交工作不会启动 GPU 上的任何工作。

对ExecuteCommandList的调用最终在 GPU 上开始工作。

在多个线程和内核上并行并均匀地将工作记录到多个命令列表中。

录制命令是一项 CPU 密集型操作,没有驱动程序线程来拯救。

命令列表不是自由线程,因此并行工作提交意味着提交多个命令列表。

请注意,设置和重置命令列表会带来成本。

为了高效地提交并行工作,您仍然需要合理数量的命令列表。

围栏出于各种原因(多个命令队列、拾取查询结果等)强制拆分命令列表。

尝试将目标设定为每帧 5-10 次ExecuteCommandList调用,并进行足够的 GPU 工作,以隐藏每次ExecuteCommandList调用的操作系统调度开销。

在上一次ExecuteCommandList调用之后,操作系统需要 50-80 微秒来安排命令列表。如果调用中的命令列表执行速度快于此,则硬件队列中存在气泡。

使用GPUView检查气泡。

您可以将 3D 队列上的图形或计算工作与专用异步计算队列上的计算工作重叠。

请记住,即使对于理论上可以与其他图形或计算任务并行运行的计算任务, GPU 上并行工作的实际调度细节也可能不会产生期望的结果。

注意哪些异步计算和图形工作负载可以一起调度。使用围栏将正确的工作负载配对。

使用ExecuteIndirect灵活性最大限度地将 CPU 工作卸载到 GPU 并减少 CPU – GPU 同步点。

请使用ExecuteIndirect将场景消隐系统移植到 GPU 。

使用ExecuteIndirect计数缓冲区来控制命令的数量,而不是发出最大数量的命令并单独预测未使用的命令。

NVIDIA 在ExecuteIndirect的Vulkan下为ExecuteIndirect提供附加功能

不推荐

帧描述符堆中的 CBV / SRV / UAV 描述符或 2K 采样器不要超过 100 万个。

不要阻止ExecuteCommandList呼叫。

ExecuteCommandList打电话可能会很贵。同时,可以在其他线程上记录新命令。

每个命令队列都可以使用自己的线程来提交ExecuteCommandList。

不要只在几个命令列表中记录所有内容或大型场景部分。这限制了您充分使用所有 CPU 内核的能力。

此外,构建几个大的命令列表意味着您可能会发现很难让 GPU 保持空闲状态。

不要只在录制完所有内容后才提交。您可能会浪费使 GPU 与其他命令列表的录制并行工作的机会。

不要期望大量的列表重用。

在对象可见性等方面,每帧通常有许多更改。

后处理可能是一个例外。

不要经常混合使用绘图、分派和复制命令。

尝试将所有绘制命令组合在一起,并将命令分派到一起,依此类推。

在同一队列上频繁混合不同类型的工作可能会导致管道排水。

不要创建太多线程或太多命令列表。

太多的线程超额订阅 CPU 资源,而太多的命令列表可能会积累太多的开销。

关于作者

Wessam Bahnassi 在 3D 引擎设计和优化方面有 20 年的经验。他最新发布的游戏包括《蝙蝠侠:阿卡姆骑士》和他自己的 120-FPS PSVR 太空射击游戏超空。他是 ShaderX / GPU Pro / GPU Zen 系列书籍的撰稿人和章节编辑。他目前在 NVIDIA 的工作包括进行优化,并为该公司的几个很酷的研究项目做出贡献。

审核编辑:郭婷

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

    关注

    68

    文章

    10533

    浏览量

    207618
  • NVIDIA
    +关注

    关注

    14

    文章

    4680

    浏览量

    102103
收藏 人收藏

    评论

    相关推荐

    如果要在ESP-IDF中使用一个FIFO作为缓冲区,该如何使用?

    ESP-IDF中有类似STM32中的FIFO定义的源文件吗?如果要在ESP-IDF中使用一个FIFO作为缓冲区,该如何使用?
    发表于 06-11 07:29

    创建DMA通道时,能否将DMA缓冲区的大小指定为8字节,并将DMA缓冲区的编号指定为1?

    创建 DMA 通道时,能否将 DMA 缓冲区的大小指定为 8 字节,并将 DMA 缓冲区的编号指定为 1?
    发表于 05-31 07:46

    stm32野火开发板做USB通信,PC端USB的缓冲区和串口缓冲区的大小是多少?

    stm32野火开发板做USB通信,用的CDC虚拟串口。 stm32端将ADC采集的数据通过USB传给电脑,传输速率理论是12Mbps,上位机是从PC端的串口缓冲区拿数据,用C#编写的上位机将
    发表于 05-17 14:02

    交换机与路由器缓冲区:寻找完美大小

    学术界和工业界一直备受争议。本文探讨了高端路由器中数据包缓冲的历史和演变,以期概述当前的实践和未来的趋势。 网络芯片中的缓冲区 在典型的路由器/交换机 ASIC 中,会发现三种类型的数据包缓冲
    的头像 发表于 04-11 16:56 402次阅读
    交换机与路由器<b class='flag-5'>缓冲区</b>:寻找完美大小

    交换芯片缓冲区大小是什么

    交换芯片缓冲区大小并不一定是固定的。缓冲区的设计和实现会根据芯片的具体型号、规格以及应用场景的不同而有所差异。一些交换芯片可能具有固定大小的缓冲区,以满足特定的性能需求或成本限制。然而,随着技术
    的头像 发表于 03-18 14:42 207次阅读

    使用UART FIFO缓冲区时,缓冲区中的数据有时会损坏的原因?

    我在使用 UART FIFO 缓冲区时遇到了以下问题。 问题描述: 当通过两个 UART 通道使用完整的 UART FIFO 缓冲区并通过两个通道进行通信时,缓冲区中的数据有时会损坏,例如,UART
    发表于 03-06 06:59

    使用SPI通信发送128字节的FIFO,清空缓冲区需要多少时间?

    我正在使用 SPI 通信发送 128 字节的 FIFO。 设置源频率为 80MHZ,SPI 速率为 5MHZ。 我想检查清空缓冲区需要多少时间。 在配置下方设置。 .spiMode
    发表于 03-05 07:08

    没有办法通过FX3固件检查缓冲区是卡住了还是已满?

    我正在尝试通过多通道 DMA 缓冲区直播 1080p60 视频,但是我们遇到了一个问题,即在向 FX3 写入一定数量的缓冲区之后,我们看到当前线程 WATERMARK 和 READY 标志保持不变
    发表于 02-23 08:01

    西门子博诊断缓冲区的使用方法

    可从在线和诊断视图中“诊断”文件夹的“诊断缓冲区”组中读出 CPU 的诊断缓冲区
    的头像 发表于 12-11 10:24 2128次阅读
    西门子博诊断<b class='flag-5'>缓冲区</b>的使用方法

    使用malloc建立缓冲区时出现错误怎么解决?

    ,我不知道现在这个已知系统的中断频率,所以我做了一个偷懒的想法,先把输入数据3秒的数据放在自建的缓冲区,再将这个数据处理后再输出,延时大概3s数据的时间,现在但是使用malloc建立缓冲区时出现错误,请问,怎么拯救?
    发表于 11-30 07:39

    C++环形缓冲区设计与实现

    一、环形缓冲区基础理论解析(Basic Theory of Circular Buffer) 1.1 环形缓冲区的定义与作用(Definition and Function of Circular
    的头像 发表于 11-09 11:21 688次阅读
    C++环形<b class='flag-5'>缓冲区</b>设计与实现

    SPI串行时钟和缓冲区数据关系是什么?

    仅当存在待发送数据时串行时钟波特发生器才产生对应数据位模式的时钟脉冲吗?如果缓冲区没数据,串行时钟就一直空闲吗?
    发表于 10-17 08:20

    SPI在通信的过程中怎么实现环形缓冲区读取?

    SPI在通信的过程中怎么实现环形缓冲区读取
    发表于 10-11 08:11

    STM32进阶之串口环形缓冲区实现

    STM32进阶之串口环形缓冲区实现
    的头像 发表于 09-19 09:20 1841次阅读
    STM32进阶之串口环形<b class='flag-5'>缓冲区</b>实现

    关于NUC980的网口的发送描述符的缓冲区地址要求4字节对齐的问题

    NUC980的网口的发送描述符的缓冲区地址要求 4字节对齐的问题,因为我用的协议栈里面要求IP数据段4字节对齐,加上以太网14字节,如果发送缓冲区要求4字节对齐,带来的问题我必须要完成一次拷贝,不能
    发表于 09-04 06:44