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

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   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除。
▌相关推荐
GPU架构与渲染性能优化
Labs 导读在开发图形渲染应用时,渲染性能优化是一个绕不开的主题,开发者往往遵循一些优化准则来构建自己的应用程序,包括数据合并、模型减面、减少采样次数、减少不必要渲染等...【详细内容】
2023-11-20  Tags: GPU  点击:(0)  评论:(0)  加入收藏
AI 时代的 GPU 生存工具包:每个开发人员必须了解的基本知识
随着传统的顺序算法到日益流行的并行算法,GPU 将成为加速复杂计算不可或缺的工具。在 AI 和机器学习任务等具有海量数据集和复杂的神经网络的架构中,GPU 的并行处理能力具有很...【详细内容】
2023-11-17  Tags: GPU  点击:(6)  评论:(0)  加入收藏
S-LoRA:一个GPU运行数千大模型成为可能
编辑:蛋酱一般来说,大语言模型的部署都会采用「预训练 — 然后微调」的模式。但是,当针对众多任务(如个性化助手)对 base 模型进行微调时,训练和服务成本会变得非常高昂。低...【详细内容】
2023-11-16  Tags: GPU  点击:(4)  评论:(0)  加入收藏
CPU vs GPU:谁更适合进行图像处理?
CPU 和 GPU 到底谁更适合进行图像处理呢?相信很多人在日常生活中都会接触到图像处理,比如修图、视频编辑等。那么,让我们一起来看看,在这方面,CPU 和 GPU 到底有什么不同,哪个更胜...【详细内容】
2023-11-14  Tags: GPU  点击:(8)  评论:(0)  加入收藏
借助Python库CuPy,发掘GPU的威力
译者 | 布加迪审校 | 重楼CuPy简介CuPy是一个Python库,与NumPy和SciPy数组兼容,为GPU加速计算而设计。通过将NumPy换成CuPy语法,您可以在英伟达CUDA或AMD ROCm平台上运行代码。...【详细内容】
2023-11-07  Tags: GPU  点击:(20)  评论:(0)  加入收藏
TensorDB:高性能向量数据库与GPU加速的未来
向量检索是一项强大的信息处理技术,它将文本、图像、音频等数据转化为数学向量,从而实现高效的搜索和分析功能,向量数据库作为大模型的一项重要基础设施已经被广泛应用。当前,全...【详细内容】
2023-11-03  Tags: GPU  点击:(7)  评论:(0)  加入收藏
深入了解:图形处理器GPU的工作原理及应用
在计算机科学领域,图形处理器(GPU)是一种专门用于处理图形和图像的硬件设备。随着计算任务的日益复杂和对图形处理能力的需求增加,GPU作为一种强大的计算工具,正逐渐崭露头角。本...【详细内容】
2023-09-11  Tags: GPU  点击:(77)  评论:(0)  加入收藏
一文了解在人工智能应用中GPU的优势
人工智能(AI)技术的迅猛发展为各个领域带来了革命性的变化,而图形处理器(GPU)作为一种强大的计算硬件,在AI应用中扮演着至关重要的角色。本文将深入探讨GPU在人工智能应用上的优势...【详细内容】
2023-09-07  Tags: GPU  点击:(107)  评论:(0)  加入收藏
后摩尔时代的关键词:GPU与Chiplet
AI芯片领域当之无愧的领导者英伟达连续两个季度强劲无比的业绩以及极度乐观的业绩预期,很大程度上表明今年第二季度是全球AI技术全面发展与扩张的开端阶段,而不是围绕科技股的...【详细内容】
2023-09-01  Tags: GPU  点击:(121)  评论:(0)  加入收藏
在用ChatGPT的时候为什么是GPU提供算力而不是CPU
ChatGPT是一种基于深度学习的自然语言处理模型,其主要作用是为人类语言建模。实际上,这是一项非常复杂的任务,因为自然语言非常灵活和多样化,每个人的语言使用方式都不同。因此,...【详细内容】
2023-08-22  Tags: GPU  点击:(94)  评论:(0)  加入收藏
▌简易百科推荐
GPU架构与渲染性能优化
Labs 导读在开发图形渲染应用时,渲染性能优化是一个绕不开的主题,开发者往往遵循一些优化准则来构建自己的应用程序,包括数据合并、模型减面、减少采样次数、减少不必要渲染等...【详细内容】
2023-11-20  移动Labs  微信公众号  Tags:GPU   点击:(0)  评论:(0)  加入收藏
微前端架构初探以及我的前端技术盘点
前言最近几年微前端一直是前端界的热门议题, 它类似于微服务架构, 主要面向于浏览器端,能将一个复杂而庞大的单体应用拆分为多个功能模块清晰且独立的子应用,且共同服于务同...【详细内容】
2023-11-20  趣谈前端  微信公众号  Tags:前端架构   点击:(2)  评论:(0)  加入收藏
干净的前端架构,看完这篇让你能够构建更简洁的前端架构
干净的前端架构,围绕这个话题有很多原则:SOLID、KISS(保持简单明了)、DRY(不要重复自己)、DDD(领域驱动设计)等等。为什么需要前端架构?功能性和非功能性的要求不仅应该在后端应用,还...【详细内容】
2023-11-20  大迁世界  微信公众号  Tags:架构   点击:(2)  评论:(0)  加入收藏
深入剖析SpringBoot底层原理
作者 | 波哥审校 | 重楼记得差不多在2015年以前,要部署一个Web应用,那得准备各种Web容器,比如Tomcat,然后打war包,然后部署到Web容器的特定目录下,以此来完成一个应用的部署,而且应...【详细内容】
2023-11-20    51CTO  Tags:SpringBoot   点击:(3)  评论:(0)  加入收藏
云计算时代下的系统技术架构设计与实践
随着云计算技术的快速发展,越来越多的企业和组织将其业务和应用迁移到云平台上。云计算为用户提供了弹性的计算资源、灵活的服务模式和高效的运维管理,成为了当今信息技术领域...【详细内容】
2023-11-16  旅游美景收藏王    Tags:架构设计   点击:(5)  评论:(0)  加入收藏
分布式限流与用户隐私保护
随着数字化时代的到来,个人数据的保护和隐私安全成为了一个日益重要的问题。在互联网应用中,用户的个人信息和隐私数据往往会被收集、存储和使用。为了保护用户的隐私权益,分布...【详细内容】
2023-11-16  王旭妍爱生活    Tags:分布式   点击:(6)  评论:(0)  加入收藏
负载均衡在大规模分布式系统中的应用:解决性能瓶颈
随着互联网的快速发展,大规模分布式系统在各行各业得到了广泛应用。这些系统需要处理大量的请求和数据,面临着性能瓶颈的挑战。负载均衡作为一种关键的技术手段,可以帮助大规模...【详细内容】
2023-11-14  办公小能手    Tags:负载均衡   点击:(14)  评论:(0)  加入收藏
如何构建六层大数据堆栈架构
面对大数据挑战而扩展其传统基础设施的企业应考虑使用专门构建的软件产品和服务来构建大数据堆栈架构。大数据堆栈是一套互补的软件技术,用于管理和分析对于传统技术来说太大...【详细内容】
2023-11-10    企业网D1Net  Tags:架构   点击:(11)  评论:(0)  加入收藏
十个使用Spring Cloud和Java创建微服务的实践案例
在使用Java构建微服务时,许多人认为只要学习一些微服务设计模式就足够了,比如CQRS、SAGA或每个微服务一个数据库。虽然这是正确的,但同时学习一些通用的最佳实践也是很有意义的...【详细内容】
2023-11-10  Java学研大本营  微信公众号  Tags:Spring   点击:(7)  评论:(0)  加入收藏
SpringBoot整合ElasticSearch详解及相关使用方法
环境:springboot2.4.12 + ElasticSearch7.8.0简介Elasticsearch是一个分布式搜索引擎,底层基于Lucene实现。它屏蔽了Lucene的底层细节,提供了分布式特性,同时对外提供了Restful...【详细内容】
2023-11-10  Spring全家桶实战案例源码    Tags:SpringBoot   点击:(14)  评论:(0)  加入收藏
站内最新
站内热门
站内头条