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

    文章

    10826

    浏览量

    211160
  • NVIDIA
    +关注

    关注

    14

    文章

    4940

    浏览量

    102818
收藏 人收藏

    评论

    相关推荐

    分享一个嵌入式通用FIFO环形缓冲区实现库

    开源项目ringbuff ,是一款通用FIFO环形缓冲区实现的开源库,作者MaJerle,遵循 MIT 开源许可协议。
    的头像 发表于 10-23 16:20 259次阅读
    分享一个嵌入式通用FIFO环形<b class='flag-5'>缓冲区</b>实现库

    内存缓冲区和内存的关系

    内存缓冲区和内存之间的关系是计算机体系结构中一个至关重要的方面,它们共同协作以提高数据处理的效率和系统的整体性能。
    的头像 发表于 09-10 14:38 435次阅读

    单片机中的几种环形缓冲区的分析和实现

    单片机中的几种环形缓冲区的分析和实现一、简介环形缓冲区(RingBuffer)是一种高效的使用内存的方法,它将一段固定长度的内存看成一个环形结构,用于存储数据,能够避免使用动态申请内存导致的内存碎片
    的头像 发表于 08-14 08:39 711次阅读
    单片机中的几种环形<b class='flag-5'>缓冲区</b>的分析和实现

    ESP8266是否可以添加AT命令并使接收缓冲区大小可调?

    是否可以添加 AT 命令并使接收缓冲区大小可调? 在Arduino,我总是丢弃数据字节,而arduino硬件串行只有64字节的缓冲区,看起来ESP8266有256个字节。
    发表于 07-17 07:36

    ESP8266有双缓冲区吗?

    我想实时传输一些信号的测量数据。信号的采样周期为 1 ms。我想每 500 毫秒发送 2048 字节(一个数据包)。ESP8266有双缓冲区(2x 2048字节)吗?其想法是计数填充一个缓冲区(周期
    发表于 07-16 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

    具有八进制反相缓冲区的扫描测试设备数据表

    电子发烧友网站提供《具有八进制反相缓冲区的扫描测试设备数据表.pdf》资料免费下载
    发表于 05-17 09:58 0次下载
    具有八进制反相<b class='flag-5'>缓冲区</b>的扫描测试设备数据表

    实现稳健的微控制器到FPGA SPI接口: 双缓冲区

    在介绍双缓冲器之前,我们将简要探讨Verilog 脉宽调制器 (PWM) 的工作原理。这一点很重要,因为双缓冲区最好被看作是硬件模块 (如 PWM) 的可寻址接口。
    的头像 发表于 05-16 09:36 639次阅读
    实现稳健的微控制器到FPGA SPI接口: 双<b class='flag-5'>缓冲区</b>!

    Stm32采用环形缓冲区接收rk3588的数据代码

    Stm32采用环形缓冲区接收rk3588的数据代码
    的头像 发表于 05-15 10:10 515次阅读

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

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

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

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

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

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

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

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

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

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