移动端GPGPU 架构

最近在面试的时候发现移动端现在是越来越热,然后就有被问到GPU的框架什么的PC端的这个可以参考这个:GPU硬件架构及其运行机制移动端的与PC端有很大的区别!比如移动端可以说没有独立的显存只有些寄存器cache 和on-chip memory!

立即渲染模式IMR :

在这里插入图片描述

IMR(Immediate Mode Rendering)就如字面意思一样——提交的每个渲染要求都会立即开始,这是一种简单而又粗暴的思路,优点缺点都非常明显,如果不用为性能担忧,这种方式会很省事,但是IMR的渲染实行的是无差别对待,那些遮蔽处理的部分依然会被渲染处理器,这也导致无意义的读写操作更多,浪费了大量性能和带宽。
对于每一个具体的绘制,渲染管线里的读写操作都是直接在显存和GPU中传输数据的, 在这种架构下,每一次渲染完的Color和Depth数据写回到Frame Buffer和 Depth Buffer都会产生很大的带宽消耗,所以IMR架构中也会有L1和L2之类的Cache来优化这部分大量的带宽消耗。

移动端分块渲染TBR模式:

在这里插入图片描述

GPU的渲染过程中,对功耗影响最大的是带宽,所以能够怎么样从设计层面减少带宽消耗,也就延申出TBR!
之前的OpenGL ES规范中CPU和GPU之间的内存是不能共享的,Vertex和Texture的Buffer是需要拷贝的,即使是在同一物理内存上。现在有了vulkan,openGL和openGL ES可以和CPU之间共享内存了,不用象以前那样拷贝来拷贝去了,当然vulkan还有其他很有用的特性。
在异构计算方面,之前也是需要在CPU和GPU之间拷贝kernel的输入数据和输出结果,在OpenCL 2.0之后,也和vulkan一起走上了共享内存的康庄大道了。当然Metal也是可以共享内存的。
对于TBR来讲,整个光栅化和像素处理会被分为一个个Tile进行处理,通常为16×16大小的Tile。TBR的结构通过On-Chip Buffers来储存Tiling后的Depth Buffer和Color buffer。

在TBR的架构里,并不是来一个绘制就执行一个的,因为任何一个绘制都可能影响到到整个FrameBuffer,如果来一个画一个,那么GPU可能会在每一个绘制上都来回运输所有的Tile,这太慢了。
所以TBR一般的实现策略是对于Cpu过来的绘制,只对他们做顶点处理,产生的结果(Frame Data)暂时写回到物理内存,等到非得刷新整个FrameBuffer的时候,比如说在代码里显示的执行GLFlush,GLFinish,Bind和Unbind FrameBuffer这类操作的时候,总之就是我告诉GPU现在我就需要用到FrameBuffer上数据的时候,GPU才知道拖不了了,就会将这批绘制做光栅化,做tile-based-rendering。
读取只发生在需要几何以及纹理信息的时候,写回也只发生在整批绘制画完的时候,具体的绘制都是在On_Chip Memory上完成的,也就是带宽消耗最大的DepthBuffer 和 ColorBuffer的读写都发生在On_Chip Memory上

延迟渲染TBDR模式:

TBR虽然比IMR聪明多了,不过还是存在不少缺陷,TBDR(Tile Based Deferred Rendering,贴图延迟渲染)闪亮登场,它跟TBR原理相似,但是使用的是延迟渲染(Deferred Rendering),合并了完美像素,通过HSR(Hidden Surface Removal,隐藏面消除)等进一步减少了不需要渲染的过程,降低了带宽需求。实际上这些改变和PC上的渲染有些相似。
其实TBDR与TBR就是 在TBR的基础上再加了一个Deferred。

总结:

作为一个即写过GPU c-model,又调过shader unit驱动的前前前前 架构师,我认为,IMR不关注成本(即不关注效率),反复overdraw也无所谓,只求峰值性能大,把晶圆面积都给shader unit,牺牲效率 ,换得峰值性能,以及通过将shader unit数量最大化 换得更好的gpgpu向量计算通用性。

而TBR是最关注成本(最关注能效比),不追求峰值性能,但求最少的带宽 功耗使用量,追求的是最高效率。把晶圆面积都给片上帧缓冲,说白了就是放弃通用性和峰值性能,只针对图形渲染优化效率。所以你看很多游戏机GPU都是TBR的,为什么?说白了,就是为了效能比,追求效率。

参考资料:

tbr管线
GPU硬件架构及其运行机制
Metal图形处理前

### GPU 架构与工作原理 GPU(Graphics Processing Unit),即图形处理单元,最初专为加速计算机图形渲染而设计。随着时间的发展,其强大的并行计算能力被发现可用于更广泛的任务。现代GPU采用了高度并行化的架构,能够同时执行大量简单指令[^2]。 #### 并行编程模型 不同于CPU的串行编程模型,GPU基于完全不同的并行编程范式运作。这使得许多原本针对CPU优化良好的算法难以直接移植至GPU平台。然而,在特定类型的密集型数据操作方面,比如矩阵乘法、图像滤波等任务中,GPU展现出了远超传统CPU的优势性能。 ### GPGPU 技术及其发展 GPGPU指的是利用GPU来进行非图形学领域的科学和技术计算活动。自2009年起,借助于诸如CUDA这样的高级API的支持,通过编写专门适配于GPU硬件特性的程序代码,研究人员可以充分利用GPU内部众多的小核心来完成复杂的数值模拟和其他高性能计算需求[^1]。 #### 编程模型 在典型的GPGPU应用程序开发过程中,开发者会区分出两部分逻辑:一部分是在标准CPU上运行的应用控制流程;另一部分则是由GPU负责的具体大规模并行化运算过程。后者往往会被封装成所谓的“内核函数”,并通过调用相应的库接口传递给底层驱动去调度执行[^4]。 ```cpp // Host code (runs on CPU) __global__ void vectorAdd(float* A, float* B, float* C, int N){ int index = threadIdx.x + blockIdx.x * blockDim.x; if(index < N) { C[index] = A[index] + B[index]; } } ``` 这段简单的C++ CUDA例子展示了如何定义一个可以在NVIDIA GPU上并发执行加法操作的kernel function。 ### 应用场景 由于具备出色的浮点数运算能力和高效的内存带宽利用率,GPGPU非常适合应用于以下几个主要领域: - **机器学习**:训练神经网络模型时涉及大量的向量/张量运算; - **物理仿真**:如分子动力学研究中的粒子间相互作用力场求解; - **视频编码解码**:实时流媒体服务背后的高效压缩算法实现; - **金融建模**:风险评估以及期权定价等领域内的蒙特卡洛方法应用。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值