您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

GPU架构与渲染性能优化

时间:2023-11-20 15:11:23  来源:微信公众号  作者:移动Labs

Labs 导读

在开发图形渲染应用时,渲染性能优化是一个绕不开的主题,开发者往往遵循一些优化准则来构建自己的应用程序,包括数据合并、模型减面、减少采样次数、减少不必要渲染等。本文结合现代GPU架构及逻辑管线执行,简单阐述这些性能优化背后的原理。

Part 01、  现代GPU架构  

早期GPU设计遵循硬件渲染管线理念,管线的每个功能阶段都有对应的硬件单元实现,这种设计导致整个渲染管线是固定功能的,开发人员无法做更多地更改,只能通过图形API实现相应的功能,例如早期OpenGL提供图形接口实现光照的设置。为服务更广泛的科技业务需求,现代GPU设计则更加灵活,遵循逻辑渲染管线的理念,引入可编程部分,硬件单元得以复用以实现管线的每个功能阶段。本文以抽象的Fermi架构来阐述现代GPU结构,如下图所示。

GPU架构与渲染性能优化

主机接口(Host Interface)是GPU与CPU沟通的桥梁,用于进行数据和指令的交换。大规模线程引擎(Giga Thread Engin)扮演大管家的角色,管理GPU中执行的所有工作,包括线程块与线程束调用,并行度调整等。核心工作部分则是图形处理集群(Graphics Processing Cluster),即GPC,负载执行图形渲染任务,一个GPU的内部可以有多个GPC,单个GPC内部抽象结构如下图所示。

GPU架构与渲染性能优化

GPC中主要包含一个光栅化引擎(Raster Engine)和多个流式多处理器(Streaming Multiprocess, 即SM)。Raster Engine主要负责将图元数据转换为屏幕上的像素,SM主要用于执行开发人员编写的着色器代码,内部包含多个数学运算核心。SM的抽象结构如下图所示。

GPU架构与渲染性能优化

几何处理引擎(Poly Morph Engine)主要进行几何处理和数据准备工作,在下述逻辑管线执行部分将介绍其部分功能。SM中缓存主要包括:

1️⃣指令缓存(Instruction Cache),用于存储指令及指令所需的数据。

2️⃣共享内存(Shared Memory),用于管线不同功能阶段数据的存储与传递。

3️⃣Uniform变量缓存(Unifrom Cache),用于存储共享的Uniform变量数据,以便多个执行线程高效访问这些数据。

4️⃣纹理缓存(Texture Cache),用于缓存纹理数据,提高访问纹理数据的速度。

SM中的计算执行部分主要包含线程束调度(Wrap Scheduler),分发单元(Dispatch Unit)以及32个计算核心(Core)。Wrap Scheduler负责线程束(wrap)的调度,一个wrap包含32个线程,这些线程的指令被提交给分发单元(Dispatch Unit),由Dispatch Unit分发给各个Core执行,指令以锁步(lock-step)方式执行,即一个wrap中所有线程按照相同的控制流路径同时执行一个指令(单指令多线程)。

Part 02、  逻辑管线执行  

GPU架构与渲染性能优化

上图是简化的逻辑管线执行过程,可分为CPU和GPU阶段。在CPU部分,开发者利用图形API构建应用程序,通过drawcall发出指令,这些指令会被推送给驱动,驱动程序首先会进行指令合法性检测,然后将其存储到Push Buffer中。

在GPU部分,接受到绘制请求后,GPU中的Host Interface会接受到这些指令数据,并交由Front End进行分析处理,处理后的数据会发送给图元分发器(Primitive Distributor),Primitive Distributor会把顶点数据组织成图元数据形式,并将这些数据按批次发送给各个GPC。

数据和指令的转送则是通过交叉栅(Cross Bar)进行的。首先进行几何阶段任务,上述SM中的Poly Morph Engine会执行Vertex Fetch功能,即获取顶点数据,然后依次执行顶点着色器代码(Vertex Shader)和几何着色器代码(Geometry Shader),这一过程则是上述提到线程指令在计算核心中以lock-step方式进行,最后Poly Morph Engine会进行视口变化(View Transform),为光栅化做准备,丢弃不在视口范围内的顶点。

光栅化阶段主要进行光栅化、片段着色器(Fragment Shader)执行以及逐片元处理。Raster Engine完成对视口内顶点数据的光栅化,Poly Morph Engine会负责属性设置(Attribute Setup),以方便光栅化时属性数据的插值采用片段着色器友好格式。Fragment Shader执行与上述Vertex Shader执行一样,唯一不同是Vertex Shader是按顶点并行进行的,而Fragment Shader是按像素并行进行的。Fragment Shader产生的结果通过Cross Bar传给渲染输出单元(Render Output Unit),Render Output Unit会以原子方式进行逐片元处理,包括模版测试、深度测试、像素混合等。最终生成的结果被存储在帧缓冲(Framebuffer)中。

Part 03、  性能优化 

在开发图形应用时,开发者往往需要遵从一些渲染性能优化原则编写自己的程序。结合上述GPU架构与逻辑管线执行流程,依次阐述其中的原理。

  • 减少drawcall

从上述的流程执行可以看出,渲染的过程是复杂的,渲一个三角行与渲染多个三角行执行的过程是一致的,为了发挥GPU强大的并行能力,需要开发者在每次绘制时,向GPU发送足够的渲染数据,以便最大限度的利用GPU。其次,drawcall并不是直接绘制,而是将指令与数据发送给GPU,过多的drawcall会增加CPU与GPU的通信开销。上述PushBuffer可以减少CPU与GPU的通信开销,CPU写入指令,当PushBuffer中填充完成,CPU将整个PushBuffer一次性发送给GPU,减少CPU与GPU间的通信次数。实践中,可以采用网格数据合并、实例绘制等方式减少drawcall调用。

  • 减少纹理采样次数

采样是指从纹理中获取像素颜色的过程。纹理采样需要从GPU内存中读取纹理数据,这是一个相对较慢的过程,读取跟不上运算速度从而导致延迟。在GPU中,为了处理由于数据没准备好而引起的线程执行延迟,Wrap调度器会挂起当前延迟的Wrap,选择可立即执行的Wrap执行。在SM中存在Texture Cache,以缓存纹理数据,提高采样效率。在实践中,可通过多重采样(multisample)实现反走样,但由于采样次数的增加,渲染性能也会下降。

  • 减少模型顶点数

顶点数据的处理主要在几何阶段,Vertex Shader的执行是按照顶点并行的,计算核心的个数是固定,顶点越少,所需执行线程的越少,完成所有线程执行花费的时间也就越少。在实践中,可以采用低精度模型结合法向贴图的模型替代高精度模型,也可使用LOD技术动态切换不同精度的模型。

  • 避免着色器中的分支语句

着色器代码指令是按照lock-step方式执行的,假设着色器代码中存在if-else语句,在一个Wrap中有32个线程,其中只有1个线程条件为真执行if语句,剩下31个线程均执行else语句,在执行if语句时,剩下31个线程会等待,当31个线程执行else语句时,执行if的线程会等待,即相当于每个线程if与else语句均执行了一次,整体执行流程如下图所示。在实践中,可以利用着色器提供的step函数来规避分支语句的编写。

GPU架构与渲染性能优化

  • 减少不必要渲染

实践中运用较多的技术是遮挡剔除与Early z。遮挡剔除一般是在CPU端判断物体是否在场景的虚拟视线范围内,以剔除不在视线范围内的物体,减少不必要的渲染。Early z则是现代GPU硬件所支持的优化技术,当光栅化结束,Raster Engine会进行Early z,比较片元深度值,剔除那些在深度方向被遮挡的片元,以减少后续片元着色器的工作量,Early z类似于提前进行了ROP阶段的深度测试。

Part 04、 结束语 

本文结合架构与管线执行简单阐述了一些性能优化准则的原理,了解现代GPU架构与逻辑管线执行有利于开发者构建高性能应用。



Tags:GPU   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
颠覆GPU、打倒英伟达!深扒12家AI芯片独角兽
谁将成为屠龙者?2024开年,去年大涨的科技股一片惨跌,但引领AI浪潮的总龙头英伟达依然势头不减。没有哪家芯片公司不眼红英伟达的地位,随着AI产业的蛋糕越做越大,硬件赛道也肉眼可...【详细内容】
2024-01-16  Search: GPU  点击:(74)  评论:(0)  加入收藏
三分钟搞懂CUDA和GPU编程
CUDA(Compute Unified Device Architecture)是由NVIDIA开发的并行计算平台和编程模型,支持开发人员利用GPU的强大计算能力进行通用计算任务。本文介绍使用CUDA进行GPU编程的基...【详细内容】
2023-12-06  Search: GPU  点击:(159)  评论:(0)  加入收藏
GPU架构知识
图形处理单元(或简称GPU)会负责处理从PC内部传送到所连接显示器的所有内容,无论你在玩游戏、编辑视频或只是盯着桌面的壁纸,所有显示器中显示的图像都是由GPU进行渲染的。对普通...【详细内容】
2023-11-24  Search: GPU  点击:(214)  评论:(0)  加入收藏
GPU架构与渲染性能优化
Labs 导读在开发图形渲染应用时,渲染性能优化是一个绕不开的主题,开发者往往遵循一些优化准则来构建自己的应用程序,包括数据合并、模型减面、减少采样次数、减少不必要渲染等...【详细内容】
2023-11-20  Search: GPU  点击:(175)  评论:(0)  加入收藏
AI 时代的 GPU 生存工具包:每个开发人员必须了解的基本知识
随着传统的顺序算法到日益流行的并行算法,GPU 将成为加速复杂计算不可或缺的工具。在 AI 和机器学习任务等具有海量数据集和复杂的神经网络的架构中,GPU 的并行处理能力具有很...【详细内容】
2023-11-17  Search: GPU  点击:(213)  评论:(0)  加入收藏
S-LoRA:一个GPU运行数千大模型成为可能
编辑:蛋酱一般来说,大语言模型的部署都会采用「预训练 — 然后微调」的模式。但是,当针对众多任务(如个性化助手)对 base 模型进行微调时,训练和服务成本会变得非常高昂。低...【详细内容】
2023-11-16  Search: GPU  点击:(206)  评论:(0)  加入收藏
CPU vs GPU:谁更适合进行图像处理?
CPU 和 GPU 到底谁更适合进行图像处理呢?相信很多人在日常生活中都会接触到图像处理,比如修图、视频编辑等。那么,让我们一起来看看,在这方面,CPU 和 GPU 到底有什么不同,哪个更胜...【详细内容】
2023-11-14  Search: GPU  点击:(191)  评论:(0)  加入收藏
借助Python库CuPy,发掘GPU的威力
译者 | 布加迪审校 | 重楼CuPy简介CuPy是一个Python库,与NumPy和SciPy数组兼容,为GPU加速计算而设计。通过将NumPy换成CuPy语法,您可以在英伟达CUDA或AMD ROCm平台上运行代码。...【详细内容】
2023-11-07  Search: GPU  点击:(352)  评论:(0)  加入收藏
TensorDB:高性能向量数据库与GPU加速的未来
向量检索是一项强大的信息处理技术,它将文本、图像、音频等数据转化为数学向量,从而实现高效的搜索和分析功能,向量数据库作为大模型的一项重要基础设施已经被广泛应用。当前,全...【详细内容】
2023-11-03  Search: GPU  点击:(148)  评论:(0)  加入收藏
深入了解:图形处理器GPU的工作原理及应用
在计算机科学领域,图形处理器(GPU)是一种专门用于处理图形和图像的硬件设备。随着计算任务的日益复杂和对图形处理能力的需求增加,GPU作为一种强大的计算工具,正逐渐崭露头角。本...【详细内容】
2023-09-11  Search: GPU  点击:(287)  评论:(0)  加入收藏
▌简易百科推荐
对于微服务架构监控应该遵守的原则
随着软件交付方式的变革,微服务架构的兴起使得软件开发变得更加快速和灵活。在这种情况下,监控系统成为了微服务控制系统的核心组成部分。随着软件的复杂性不断增加,了解系统的...【详细内容】
2024-04-03  步步运维步步坑    Tags:架构   点击:(4)  评论:(0)  加入收藏
大模型应用的 10 种架构模式
作者 | 曹洪伟在塑造新领域的过程中,我们往往依赖于一些经过实践验证的策略、方法和模式。这种观念对于软件工程领域的专业人士来说,已经司空见惯,设计模式已成为程序员们的重...【详细内容】
2024-03-27    InfoQ  Tags:架构模式   点击:(13)  评论:(0)  加入收藏
哈啰云原生架构落地实践
一、弹性伸缩技术实践1.全网容器化后一线研发的使用问题全网容器化后一线研发会面临一系列使用问题,包括时机、容量、效率和成本问题,弹性伸缩是云原生容器化后的必然技术选择...【详细内容】
2024-03-27  哈啰技术  微信公众号  Tags:架构   点击:(10)  评论:(0)  加入收藏
DDD 与 CQRS 才是黄金组合
在日常工作中,你是否也遇到过下面几种情况: 使用一个已有接口进行业务开发,上线后出现严重的性能问题,被老板当众质疑:“你为什么不使用缓存接口,这个接口全部走数据库,这怎么能扛...【详细内容】
2024-03-27  dbaplus社群    Tags:DDD   点击:(11)  评论:(0)  加入收藏
高并发架构设计(三大利器:缓存、限流和降级)
软件系统有三个追求:高性能、高并发、高可用,俗称三高。本篇讨论高并发,从高并发是什么到高并发应对的策略、缓存、限流、降级等。引言1.高并发背景互联网行业迅速发展,用户量剧...【详细内容】
2024-03-13    阿里云开发者  Tags:高并发   点击:(5)  评论:(0)  加入收藏
如何判断架构设计的优劣?
架构设计的基本准则是非常重要的,它们指导着我们如何构建可靠、可维护、可测试的系统。下面是这些准则的转换表达方式:简单即美(KISS):KISS原则的核心思想是保持简单。在设计系统...【详细内容】
2024-02-20  二进制跳动  微信公众号  Tags:架构设计   点击:(36)  评论:(0)  加入收藏
详解基于SpringBoot的WebSocket应用开发
在现代Web应用中,实时交互和数据推送的需求日益增长。WebSocket协议作为一种全双工通信协议,允许服务端与客户端之间建立持久性的连接,实现实时、双向的数据传输,极大地提升了用...【详细内容】
2024-01-30  ijunfu  今日头条  Tags:SpringBoot   点击:(8)  评论:(0)  加入收藏
PHP+Go 开发仿简书,实战高并发高可用微服务架构
来百度APP畅享高清图片//下栽のke:chaoxingit.com/2105/PHP和Go语言结合,可以开发出高效且稳定的仿简书应用。在实现高并发和高可用微服务架构时,我们可以采用一些关键技术。首...【详细内容】
2024-01-14  547蓝色星球    Tags:架构   点击:(114)  评论:(0)  加入收藏
GraalVM与Spring Boot 3.0:加速应用性能的完美融合
在2023年,SpringBoot3.0的发布标志着Spring框架对GraalVM的全面支持,这一支持是对Spring技术栈的重要补充。GraalVM是一个高性能的多语言虚拟机,它提供了Ahead-of-Time(AOT)编...【详细内容】
2024-01-11    王建立  Tags:Spring Boot   点击:(124)  评论:(0)  加入收藏
Spring Boot虚拟线程的性能还不如Webflux?
早上看到一篇关于Spring Boot虚拟线程和Webflux性能对比的文章,觉得还不错。内容较长,抓重点给大家介绍一下这篇文章的核心内容,方便大家快速阅读。测试场景作者采用了一个尽可...【详细内容】
2024-01-10  互联网架构小马哥    Tags:Spring Boot   点击:(115)  评论:(0)  加入收藏
站内最新
站内热门
站内头条