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

    文章

    11216

    浏览量

    222917
  • NVIDIA
    +关注

    关注

    14

    文章

    5496

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    CW32L052串口的缓冲区机制

    默认缓冲区配置 CW32L052的UART模块支持硬件FIFO(通常为16字节),但HAL库或用户代码需手动管理接收缓冲区。若未显式分配足够大的软件缓冲区,可能导致数据溢出。 HAL库缓冲区
    发表于 11-24 06:40

    飞凌嵌入式ElfBoard-标准IO接口之设置缓冲区

    件的stdio缓冲区,应以动态或静态的方式在堆中为该缓冲区分配一块空间,而不是分配在栈的函数内的自动变量(局部变量)。如果buf等于NULL,那么会自动分配一块空间作为该文件的stdio缓冲
    发表于 11-14 09:02

    移植的lvgl,在运行的时候,缓冲区无法释放怎么解决?

    代码在运行的时候,只有lvgl线程用于刷新,另一个线程只有一个串口打印。 当运行一段时间后,发现,程序会在LVGl中,lv_refr.c这个库下面第625行代码, 在这一直判断,看介绍说是在等待释放缓冲区,求大神给个思路
    发表于 09-09 07:28

    如何清除CYUSB3014的缓冲区数据?USB接口数据什么时候发送到电脑?

    、如何清除GPIF II接口处对应的DMA BUFFER数据?当标志设置为满/非满状态时,一旦 DMA 缓冲区已满,标志信号就会指示它已满。清除DMA缓冲区数据后,相应的标志信号会改变吗?会不会变成非满状态
    发表于 07-18 07:58

    USB缓冲区中的内容满了之后,是否有标志位进行反馈?

    USB缓冲区中的内容满了之后,是否有标志位进行反馈。
    发表于 07-17 07:13

    请问USB缓冲区取数据可以多次取吗?

    在使用USB软件获取数据是,下位机给我发送了13个32位数据到USB IN缓冲区,为什么我调用API函数想要第一次取1个32位数据,取完之后再取12位数据,程序会卡死。
    发表于 07-16 08:12

    FX3 Socket缓冲区切换的最大时间是多少?

    FX3_Programmers_Manual 文档的第 10 章提到“每个缓冲区缓冲区切换开销为 550 - 900 ns”。 Getting_Started_with_EZ-USB_FX3 文档
    发表于 05-16 07:51

    在传输DMA通道中的所有缓冲区后,DMA标志(就绪和部分)被卡住了是怎么回事?

    2 次传输,再次卡住的时间更短,然后顺利传输数据。 Buffers working until they get stuck缓冲器在卡住之前一直在工作 前两个缓冲区的标志 A()和 B(下),然后
    发表于 05-16 07:18

    求助,关于3014的缓冲区设置疑问求解

    不够导致rgb24 1080p@60fps为静态? 缓冲区的大小和数量是否需要对应? 因为720p@60fps的缓冲区的大小和数量为34kb,3,是可以出图且动态,但图像依然是颠倒的。我将
    发表于 05-06 13:42

    请问如何在Linux中使用帧缓冲区更新epdc显示?

    我正在使用带有 epdc 显示子卡 (IMXEBOOKDC5) 的 IMX8ULP EVK。使用 Linux 映像引导后,epdc 显示无法使用帧缓冲区进行更新。当检查显示 pmic 的电源使能引脚
    发表于 04-01 06:41

    FreeRTOS进阶使用之流缓冲区:高效处理字节流的秘密武器

    在嵌入式开发中,流缓冲区(Stream Buffer)是FreeRTOS中用于高效处理字节流数据传输的核心机制,尤其适合任务间或中断与任务间的连续数据传输场景(如串口通信、网络数据流等)。本文将深入
    发表于 03-24 11:37

    L9663如何使用上行缓冲区发送同步脉冲?

    我根据L9663 Datasheet这个手册,想使用这个配置“通过带有上行数据缓冲区的SPI触发。微控制器发送相应的SPI命令以发送同步脉冲。然后,同步脉冲触发发生器根据上行数据缓冲区中的值在内部
    发表于 03-13 08:15

    缓冲区溢出漏洞的原理、成因、类型及最佳防范实践(借助Perforce 的Klocwork/Hleix QAC等静态代码分析工具)

    本期来认识软件漏洞的“常客”——缓冲区溢出,C/C++开发者尤其要注意!全面了解该漏洞的成因、类型、常见示例,以及如何借助Klocwork、Helix QAC等SAST工具进行防护。
    的头像 发表于 03-04 16:39 1718次阅读
    <b class='flag-5'>缓冲区</b>溢出漏洞的原理、成因、类型及最佳防范<b class='flag-5'>实践</b>(借助Perforce 的Klocwork/Hleix QAC等静态代码分析工具)

    RTOS的流缓冲区机制解析

    SAFERTOS中的流缓冲区(Stream buffer)机制,可以实现任务到任务或中断到任务之间的通信。字节流是由发送方写入缓冲区,接收方读取缓冲区数据。流缓冲区作为队列的轻量级级替
    的头像 发表于 02-14 11:33 974次阅读
    RTOS的流<b class='flag-5'>缓冲区</b>机制解析

    AMD Zen 4处理器悄然禁用循环缓冲区

    近日,AMD在更新BIOS后,对Zen 4架构的处理器进行了一项未公开说明的更改:禁用了循环缓冲区(Loop Buffer)功能。这一变化引发了业界和用户的广泛关注。 循环缓冲区作为CPU前端的一个
    的头像 发表于 12-11 13:46 829次阅读