OpenGL-ES 学习(5)---- GPU 基础知识

目录

      • Arm GPU 架构说明
      • 移动系统的特点
      • 渲染管线
        • 渲染管线简介
        • 几何处理
        • 像素处理
      • 渲染管线的硬件
        • IMR(立即渲染)
        • TBR(Tile Based Rendering)
      • 渲染硬件的实现
        • CPU
        • GPU 设计
      • Mali Shadercore
      • 重要补充

Arm GPU 架构说明

UtGard:
比较早的架构,支持到 OpenGL-ES 2.0,VertexShader 和 FragmentShader 是分离的
主要型号:mali-200, mali-400, mali-450, mali-470

MidGard:
比较早的架构,基于 128 bit 向量
主要型号:mali-T6xx, mali-T7xx, mali-T8xx

Bifrost:
对于Bifrost,例如G76,一个shader core可以同时运行几十个线程,
从 Mali 的资料显示,shader core 一般主要由三个部分组成,ALU,L/S Uni,TEXTURE, late-Z unit 几个主要模块
在G76上是 8-wide wrap 的,一般设置为 3 个 ALU
(其余的型号可能不一样,例如 G51/G72 是 4-wide wrap 的,G72同样是3个ALU;
G52 跟 G76一样,不过G52可配置成2个ALU的)
主要型号:mali-G31, mali-G51, mali-G71, mali-G52, mali-G72, mali-G76

ValHal:
2018 推出,基本都是超标量处理器
主要型号:Mali-G57,Mali-G77

移动系统的特点

桌面系统和移动系统的区别在于,桌面系统由 CPU, GPU+VRAM, DRAM 组成,功耗在 225~370 W 左右
并且辅以主动散热;而移动系统使用统一内存,一块芯片上集成了 CPU, GPU, DRAM,功耗只有 2~3 W,被动散热,
并且手机的塑料或玻璃外壳并不利于散热,还有手机壳会影响散热。
因此手机渲染的效率要求是比桌面高很多的。(注:这也是为什么同样的芯片,在平板上性能可能会比手机更好)

移动 GPU 和其它主要硬件一般通过总线相连。移动 CPU 通常采用大小核设计,大核考虑性能,小核考虑功耗,系统会自动为线程分配合适的核心。统一内存被所有芯片共享,访问内存的操作也是极其昂贵的,约 100 mW/GB/s。DPU 可以将多层画面合为一帧,包括图像变换,颜色转换,根据显示帧率实时运行,一些复杂的合成任务仍可能会交由 GPU。

总线上除了上述模块,还有像是基带芯片、VPU、ISP、NPU、广播 I/O、相机 I/O 等,同样共享 2~3 W 的功耗。
提到功耗,就不得不提处理器的功耗曲线,提升性能的同时,功耗大约是指数上升的。基准频率下,处理器的功耗和性能比较均衡。手机要根据 GPU 或 CPU 的预算,为他们分配合适的功耗,但总数依然不超过 2~3 W。CPU 和 GPU 通过大量的并行计算,可以以较低的功耗获得一致的性能。(注:这里的假设是并行 Overhead 不大,且所有过程都可以并行化,实际情况会有一个最合适的并行数量)

渲染管线

渲染管线简介

以绘制地球月球为例子,CPU 把绘制的 Shader、Buffer、贴图以及 Attachment 准备好,所有需要的数据写入显存,然后发送了两个 Draw Call D1, D2。

GPU 几何处理调用 Vertex_Shader S1,计算出顶点位置,像素处理调用 Pixel Shader S2 对每一个像素进行着色。Shader S1, S2 和 Vertex Buffer B1 是复用的,但是传的参数不同,贴图 T1, T2 不同,所以绘制出来的东西也不同。(注:渲染管线的定义有很多,建议参照《Real-Time Rendering》一书的定义,这里的管线应该更偏向 API)
render_pipeline
Compute 处理游离于渲染管线之外,它从显存(内存)中读取数据,然后又写回显存(内存)

几何处理

按顺序有 5 个阶段,输入是物体空间的顶点,输出是屏幕空间的图元:
顶点着色(可编程):执行 Vertex Shader(VS),一般计算骨骼动画、坐标转换
细分着色(可编程,可选):用于曲面细分增加细节,由 Controller Shader, Tessellator, Evaluation Shader 构成(Tesllation)
几何着色(可编程,可选):程序化生成和删除面片
图元组装:将顶点组装成点、线、三角面 (primitives)
图元剔除:剔除视锥体之外和背向 / 正向相机的图元 (clip & cull)

移动渲染通常不会使用细分着色,因为代价比较昂贵;
几何着色已经过时,一般可以用 Compute Shader 代替。
optimize Geometryy processing
图元剔除可以发生在更早的阶段来节省开销,Mali 的 Bifrost 系 GPU Compiler 可以拆分 Vertex Shader,将其它属性的计算 (varying shader) 放到了剔除阶段之后。(也就是图中的 vertex_shader和varying Shader) 尽管 GPU 可以这么做,最好的方式是 CPU 在软件处理时就已经做了部分剔除。(注:比如逐物体的视锥体裁剪和软件遮挡剔除,桌面端还会用上 Hi-Z)
这里要注意移动 GPU 在图元装配之后,光栅化之前就开始了 primitives culling
未优化的渲染管线是 图元装配之后进行图元剔除,优化后的管线在拆分Vertex Shader称为 Vertex Shader 和 Varying Shader, 优先执行的是 Vertex Shader,然后在 Varying Shader 之前执行 primitives)

像素处理

像素处理也有 5 个阶段,输入是屏幕空间图元,输出是像素颜色:
光栅化(rasterazation):从图元到像素点到 Quad,有一些还支持可变渲染率,
Quad 为每四个像素一组(不同的 GPU 可能有区别),用于计算 Mipmap 和各向异性过滤需要的梯度 (四个像素为一组的集合)

Early ZS(Z & Stencil)测试:不修改像素 Depth/Stencil 的片元在此阶段选择性剔除

片元着色(可编程):执行 Pixel Shader(ps),计算像素颜色

Late ZS 测试:其余未经过 Early ZS 测试的片元在此阶段选择性剔除

混合(blend):混合颜色,体现透明或不透明物体
optimize_pixelProcessing
渲染管线的三个大阶段可以并行,以最大化压榨硬件性能。需要注意的是 OpenGL ES 的一些同步函数,例如 glFinish 或者 Vulkan 的 Barrier 设置不合理,会导致并行性下降。并行渲染的性能也具有木桶效应,三者中最耗时的部分将成为渲染瓶颈。
paralle_processing

渲染管线的硬件

桌面GPU 硬件架构形式:几何处理 → 像素处理 → Framebuffer,通过一些 Buffer 来传递中间结果。可编程的 Shader Core 用于执行 Shader 代码,与 CPU 设计迥异。

现代 GPU 有两种常见的渲染模式:立即渲染(IMR)、Tile-Based 渲染(TBR)。

IMR(立即渲染)

立即渲染模式中,几何处理 → 像素处理使用的是简单的 FIFO Buffer,这块 Buffer 在显存中,Draw Call 以符合直觉的方式,顺序绘制到 Framebuffer 上。缺点是,GPU 读写内存中 Framebuffer 的带宽需求比较高。(注:尤其是延迟渲染,除非 Framebuffer 全部塞进显存里)
IMR

TBR(Tile Based Rendering)

Tile-Based 渲染中,Framebuffer 会被划分为一个个瓦片(Tile),每次仅渲染一个 Tile
几何处理 → 像素处理使用内存中的 Tile Lists 记录每个 Tile 需要的几何和渲染信息,处理完所有的三角面后,把每一个 Tile List 读入片上缓存,像素渲染在 GPU 中执行,最后将渲染结果传回内存。TBR 架构下,三角面片更昂贵,而渲染像素更高效。(可以看到是将 Geometry list 放到内存上了)
注意:TBR 和 TBDR 的区别在于几何处理的数据到像素处理数据的传递

TBR
由于统一内存读写非常昂贵,TBR 减少了大量带宽需求,提高了缓存的 Locality,使得 ZS 测试、MSAA、拷贝、面片剔除等操作的开销变得很小,并且可以实现完全的片上延迟渲染。缺点是 Tile Lists 位于内存中,三角面数、VS 的输出限制较高,无法高效执行细分着色和几何着色。

TBR 每个 Pass 三个阶段是严格顺序执行的,不同 Pass 之间可以并行。首先并行粒度就不是 Draw Call 而是 Pass,也容易遇到 API 的不并行问题。

Tile_base_render
移动 GPU 的 TBR 设计正是适应了高分辨率 2D 渲染的应用场景:面片不多,占屏比小,低功耗。
一些系统可能会采用介于 IMR 和 TBR 两者之间的渲染模式,取决与如何权衡顶点和像素开销。(注:猜想随着硬件和渲染 API 的发展,GPU 的最终目标是完全的高性能片上渲染)

渲染硬件的实现

CPU 和 GPU 的设计差别:

CPUGPU
低线程数极高线程数
注重单线程性能注重计算的整体吞吐率
对内存延迟敏感吞吐率取决于硬件能效
CPU

CPU 的一般的运行流水线是,取出指令 → 读寄存器 → 计算 → 写寄存器,其中 “读-算” 为一个 CPU 周期(clock),它需要花费多个时钟周期(常见的是 5~10 个 cycles),如果能减少每个 CPU 周期的时钟周期,就能在同样的频率下,获得更好的性能。前后指令之间经常有依赖关系,如果让流水线停下等待上一条指令执行完毕,会对性能造成影响。

CPU 处理器硬件优化:

  1. 结果转发(Result Forwarding):前一个指令的结果在写入寄存器前,即可作为后面指令的输入

  2. 分支预测:运行时等待会对性能造成影响,CPU 还可以猜测条件分支的走向,提早运行预测的路径,如果猜测正确,CPU 流水线的效率得到提高,若猜测错误则进行回滚

  3. 乱序执行:当不存在数据依赖时,很多指令能细粒度地并行,CPU 可以调用多组 ALU 来同时运行,前提是这些指令必须是连续的,因此高端处理器在取出指令后,会重新组合再做超标量(Super Scalar)分发

  4. 推测执行(Speculative Execution):在空闲的单元上,执行可能需要执行的指令,比如同时执行 if 和 else 指令

  5. 推测数据预读(Speculative Data Fetch):预测并提前在缓存中读入可能需要的内存数据

  6. 大容量缓存:比如 L2、L3 缓存,来应对内存延迟

如此多的组件只是为了让 CPU 的单线程性能提升,但它们同样会占据芯片空间,也会增加功耗。基于能效考虑,GPU 可以学习的是 CPU 中的 SIMD(单指令多数据流)的硬件设计。

GPU 设计

GPU 渲染核心的管线一样是,取出指令 → 读寄存器 → 计算 → 写寄存器,其特性在于向量化计算,同时会有多组 ALU 参与相同的计算。一个 “读-算-写” 的 GPU 周期会占据多个时钟周期,打个比方每过 10 个 cycles,GPU 将多个线程的指令和数据读入(注:多个线程执行的是相同的指令),然后同时计算。
render_every10_cycles
渲染核心硬件优化:
这样设计的管线,每个周期内只进行一次计算操作,对单个线程来说是变慢了,但是保证了一定的吞吐量,良好的并行性避免了和 CPU 一样的需要乱序执行和推测执行。GPU 周期之间没有重叠,可以保证指令之间满足依赖条件,不需要结果转发和分支预测。

并行设计虽然对单线程的延迟不那么敏感,但与内存传输数据依然需要 ~150 个 GPU 时钟 cycles,而缓存也无法容下所有的渲染资源。GPU 的优势就在于线程数量极多,一部分线程向内存请求数据的同时,另一部分被唤起执行。所以数据预读和大容量缓存,在 GPU 面前也可能是多余的。

对于需要处理 RGBA 颜色或是 XYZW 矢量的 GPU 来说,SIMD 一次计算四个分量看上去很高效,但是还有大量的计算不能打包成 vec4,因此相比使用硬件矢量计算单元,SIMT(单指令多线程)是一种更具性价比的方案。

GPU 中执行相同指令的一组线程有很多名称,比如 Warp(nvidia), Wavefront(AMD), Subgroup quad(Arm)等。使用 SIMT 的好处的一个 Warp 的向量容量可以是变化的,多个线程共同分摊控制面 (Control Plane)开销。
SIMT
坏处是同一个 Warp 在执行分支语句的时候,如果有一部分需要执行 if 而另一部分执行 else,所有的线程都需要运行两个分支,然后过滤掉不需要的部分结果。这叫 Warp Divergence,只能通过 Shader 代码去避免。(注:实际情况中动态分支如果能控制好 Divergence,可以达到一定的正面优化效果)

最后需要说明,GPU 有硬件加速单元,可以对插值、纹理解压、纹理过滤、颜色混合等固定操作进行加速,以此提升能效。

SIMT : 执行相同指令的一组线程;
SIMD : 单个指令可以执行多个数据的运算;

Mali Shadercore

一个 Mali GPU 的渲染核心大概长这样,渲染核心没有标准定义,不同厂商的设计也不尽相同。
bifrost_architecture
ShaderCore 的内部逻辑如下:
ShaderCore

重要补充

我在简书上的 GPU 知识博客:
GPU 基础知识

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/703193.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【小尘送书-第十四期】《高效使用Redis:一书学透数据存储与高可用集群》

大家好,我是小尘,欢迎你的关注!大家可以一起交流学习!欢迎大家在CSDN后台私信我!一起讨论学习,讨论如何找到满意的工作! 👨‍💻博主主页:小尘要自信 &#x1…

Vue组件间的通信详解

在Vue中,组件之间的通信可以有多种方式实现: Props 和 $emit Props:父组件向子组件传递数据时,通过属性绑定(v-bind 或 :)将数据作为属性传给子组件。子组件需要在props选项中声明它接收的属性列表。**emit…

Base64 编码 lua

Base64 编码 -- Base64 字符表 local base64_chars { A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,…

文献阅读:Large Language Models are Null-Shot Learners

文献阅读:Large Language Models are Null-Shot Learners 1. 文章简介2. 方法介绍3. 实验考察 & 结论 1. 基础实验 1. 实验设计2. 实验结果 2. 消融实验 1. 小模型上的有效性2. ∅CoT Prompting3. 位置影响4. 组成内容 4. 总结 & 思考 文献链接&#xff1…

gitlab 忘记root密码,修改root密码

1.使用root用户登录服务器 2.进入GitLab的安装目录,一般是 /opt/gitlab/ 3.执行以下命令重置密码: sudo gitlab-rails consoleuser User.where(id: 1).first user.password new password user.password_confirmation new password user.save! 退出…

openEuler22.03 LTS中配置vsftp服务器

一、说明 配置环境:VMware虚拟机中安装openEuler 22.03 LTS系统,并确保该Linux服务器能访问Internet。 FTP服务器的身份认证模式 vsftpd服务提供以下3种身份认证模式,前两种模式比较常见,第3种模式是vsftpd的特有的服务模式。 …

代码随想录算法刷题训练营day23

代码随想录算法刷题训练营day23:LeetCode(669)修剪二叉搜索树、LeetCode(108)将有序数组转换为二叉搜索树、LeetCode(538)把二叉树转化为累加树 LeetCode(669)修剪二叉搜索树 题目 代码 /*** Definition for a binary tree node.* public class TreeNode {* …

【Vue】Vue双向绑定原理

【Vue】Vue双向绑定原理 定义:数据变化视图会自动更新,视图变化数据也会更新原理:通过数据劫持和发布订阅模式实现的实现 定义:数据变化视图会自动更新,视图变化数据也会更新 比如说,当在输入框输入文字时…

SocketWeb实现小小聊天室

SocketWeb实现小小聊天室 消息推送的常见方式轮询长轮询SSE(server-sent event):服务器发送事件WebSocketWebSocket简介WebSocket API 实现小小聊天室实现流程消息格式客户端-->服务端服务端-->客户端 消息推送的常见方式 轮询 浏览器…

图书推荐|Windows Server 2022 Active Directory配置实战

十几年磨一剑,畅销书第10次升级 本书简介 《Windows Server 2022 Active Directory配置实战》是微软技术专家最新推出的Windows Server 2022两卷力作中的Active Directory配置实战篇。 《Windows Server 2022 Active Directory配置实战》延续了作者一贯的写作风格…

高可用k8s集群(k8s-1.29.2)

0、高可用k8s集群(k8s-1.29.2) 文章目录 0、高可用k8s集群(k8s-1.29.2)0、环境准备(centos-7.9、rocky-9.3 环境配置调优)1、nginx keepalived(负载均衡高可用)1.1、nginx1.2、keep…

MATLAB环境下基于洗牌复杂演化的图像分割算法

智能优化算法因其较强的搜索解能力而得到了大量的应用,在这些计算智能算法中,群体智能优化算法因其高效性、有效性以及健壮性等优点而得到了科研人员的青睐。这类算法借鉴生物群体的合作特性,主要解决大规模复杂的分布式问题,研究…

第7.1章:StarRocks性能调优——查询分析

目录 一、查看查询计划 1.1 概述 1.2 查询计划树 1.3 查看查询计划的命令 1.3 查看查询计划 二、查看查询Profile 2.1 启用 Query Profile 2.2 获取 Query Profile 2.3 Query Profile结构与详细指标 2.3.1 Query Profile的结构 2.3.2 Query Profile的合并策略 2.…

WPF Style样式设置

1.本window设置样式 <Window x:Class"WPF_Study.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.microsoft.com/expressi…

开源软件:彻底改变软件产业的趋势

开源软件:彻底改变软件产业的趋势 开源软件的兴起彻底改变了软件产业的面貌。作为一种软件开发和许可的新模式,开源软件为用户和开发者带来了前所未有的便利。 开源软件的优势 与传统的商业软件相比,开源软件具有以下独特优势: 低成本:开源软件可以免费获取源代码,大大降低了…

CentOS删除除了最近5个JAR程序外的所有指定Java程序

帮我写一个shell脚本,ps -eo pid,lstart,cmd --sort=-start_time | grep "pgz-admin"查到的结果,返回的所有进程PID,第六个之上的,全部kill 当然,你可以创建一个简单的Shell脚本来完成这个任务。以下是一个例子: #!/bin/bash# 获取包含 "pgz-admin"…

JSONVUE

1.JSON学习 1.概念: JSON是把JS对象变成字符串. 2.作用: 多用于网络中数据传输. JavaScript对象 let person{name:"张三",age:18}//将JS对象转换为 JSON数据let person2JSON{"name":"张三","age":18}; 3.JS对象与JSON字符串转换…

Python爬虫-付费代理推荐和使用

付费代理的使用 相对免费代理来说&#xff0c;付费代理的稳定性更高。本节将介绍爬虫付费代理的相关使用过程。 1. 付费代理分类 付费代理分为两类&#xff1a; 一类提供接口获取海量代理&#xff0c;按天或者按量收费&#xff0c;如讯代理。 一类搭建了代理隧道&#xff0…

中国赛车公园行业市场现状分析与投资前景预测研究报告

全版价格&#xff1a;壹捌零零 报告版本&#xff1a;下单后会更新至最新版本 交货时间&#xff1a;1-2天 第一章赛车公园概述 第一节赛车公园概念及特点 一、赛车公园的定义 赛车主题公园就是以赛车为主题&#xff0c;集餐饮住宿、休闲娱乐多种功能于一体的综合性主题公园…

网络安全的主要威胁及应对方法

大家好我是咕噜美乐蒂&#xff0c;很高兴又和大家见面了&#xff01; 网络安全是当今社会中至关重要的议题&#xff0c;面临着各种各样的威胁和挑战。为了更详细地回答您的问题&#xff0c;下面将分析并提供常见的网络安全威胁以及相应的应对方法。 一、恶意软件&#xff08;…