大线程组下的GPU占用率和资源使用优化

本文探讨了在使用大线程组时如何优化GPU占用率和资源使用,特别是针对计算着色器的性能问题。通过分析寄存器、LDS使用限制,提出目标是保持每个计算单元至少两个线程组,以充分利用GPU资源。文章详细讨论了大线程组带来的挑战,如VGPR限制、LDS使用、内存延迟等,并提供了相应的优化策略,包括减少VGPR使用、高效利用LDS、避免单线程组运行等,以提高GPU性能和利用率。
摘要由CSDN通过智能技术生成

译者: 刘超(君临天下) 审校:梁君(君儿)

介绍

本周,我们收到了一篇来自Sebastian Aaltonen的客座文章,他是Second Order有限公司的联合创始人并且曾经作为Ubisoft公司的高级渲染工程师。Second Order最近宣布了它们的第一个游戏Claybook!该游戏看起来非常的棒,它的渲染器十分有新意,使用GPU用非传统的方法达到该效果。请看Claybook

Sebastian将会解决他在开发Claybook时遇到的一些有趣的问题:你如何在使用大线程组的情况下优化GPU占用率和考虑着色器的资源使用问题。

大线程组下的GPU占用率和资源使用优化

当使用一个计算着色器时,考虑线程组的大小对性能的影响是非常重要的。有限的寄存器空间,存储延迟和SIMD占用率,每一个都以不同的方式影响着色器的性能。本文将会讨论潜在的性能问题,以及如何正确的使用相关技术和优化来显著的提高着色性能。本文将集中关注大线程组的问题,但是这些提示和技巧对于一般的问题也是有所帮助的。

背景

DirectX®11渲染引擎5的计算着色器规范(2009)要求每一个线程组允许的最大内存大小是32KB,并且最大的线程组包含1024个线程。对于最大的寄存器计数并没有指定,如果寄存器存在一定的压力需求,编译器将会从寄存器溢出到内存中。然而,由于存储延迟,溢出将会对性能产生显著的负面影响,这些问题应该在代码中被避免。

AMD GPU允许在单个计算单元(CU)上同时执行两组包含1024个线程的线程组。然而,为了占有率最大化,着色器必须最小化寄存器和LDS的使用,以便所有线程的资源请求在计算单元上是合适的。

AMD GCN计算单元(CU)

以下是一个GCN计算单元的架构:

一个GCN计算单元(CU)包含四个SIMDs(单指令流多数据流),每一个包含一个包含32位的VGPRs(矢量通用寄存器)的64KB寄存器文件,对于每一个计算单元(CU)总共拥有65536个VGPRs。每一个计算单元(CU)同时还包含一个32位的SGPRs(标量通用寄存器)寄存器文件。直到GCN3,每一个计算单元(CU)包含512个SGPRs,从GCN3开始,该数字激增到800。每一个计算单元(CU)能够包含3200个SGPRs,或者12.5KB的寄存器文件。

用于计算单元运行的预定任务的最小单元称之为wave,每一个wave包含64个线程。计算单元上的四个SIMDs的每一个可以最大调度10个并发wave。在等待完成内存操作时,计算单元可能会挂起一个wave,来执行另外一个wave。这会有助于隐藏延迟,以及最大限度的利用计算单元的计算资源。

SIMD的VGPR的文件大小引入了一个重要的限制:SIMD的VGPRs被均匀的分配到了已经激活的wave的线程中。如果一个着色器需要用到比实际更多的VGPRs,SIMD将不会执行最优的wave数量。占有率(occupancy):GPU在给定时间能够执行并行工作的数目,其结果会受到影响。

每一个GCN计算单元具有64KB本地数据共享

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农老K

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值