图像处理单元(GPU)的简介
前言
图形处理单元(Graphics Processing Unit, GPU),又称显示核心、视觉处理器、显示芯片,是一种专门设计用于高效处理图形和并行计算的硬件单元。
GPU被广泛用于嵌入式系统、移动电话、个人电脑、工作站和电子游戏解决方案当中。现代GPU对图像和图形处理效率很高,也使得比通用处理器CPU在数据并行处理计算上更具有优势。
GPU的主要应用场景如下:
1)可视化软件、仪表界面绘制2)UI交互桌面的合成与渲染 3)高级视频后处理4)3D游戏程序实时渲染5)计算机视觉算法的加速6)神经网络的计算加速7)高精度科学计算库的加速
GPU分类
从功能定位上大致可以分为四类SoC芯片中的GPU一般属于移动端3D GPU,支持EGL/OpenGL ES开发,主要用于三维图像渲染,兼容二维图像绘制功能,同时支持OpenCL开发,用于科学计算的加速以及轻量化神经网络模型的部署。不支持图像的显示输出功能,需要配合响应的硬件显示模块和接口(HDMI/DP/MIPI DSI等)输出图像渲染的结果。
图像渲染原理:
图像渲染基于三角形单元的组合和映射变换,通过实时的位置以及纹理坐标计算在二维的显示画面中拟合人眼看到的三维立体图像效果。
而绘制这样的效果需要通过复杂的流水线来实现,我们称之为渲染管线。
渲染管线的一般流程如下图所示:
由于受面积、功耗、带宽等因素限制,SoC芯片中的GPU无法像桌面级GPU一样一次性绘制大尺寸分辨率图像,因此一般采用TBR(Tile-Based Rendering)架构,将图像拆分成tile小块进行逐块的渲染处理,最后合成整幅画面。
渲染管线的硬件调度的简化流程如下所示:
(1)CPU执行应用程序和图形驱动程序,将CPU产生的内容和图形建模信息写入内存,并发送绘图指令到GPU(2)在GPU内部,有专门的模块负责解释从CPU传来的指令,并且准备GPU内部的数据处理(3)GPU读取网格模型,进入几何处理阶段,将模型转换到屏幕中正确的位置,以及添加光照等相关向量数据,发送给下一阶段(4)像素处理阶段,接收多边形的数据,执行光栅化的操作,计算出每个像素的颜色,要执行这些操作,需要CPU传入各种不同的贴图资源(5)渲染管线结束,将渲染的framebuffer交给PL端HDMI TX Subsystem显示驱动来显示
实际上的渲染管线流程更加复杂,无法实现在裸机环境下的部署,需要配合高集成度的软件驱动框架和操作系统来实现,如有机会在之后的文章中会介绍在国产操作系统等平台上部署GPU渲染的相关内容。
图像渲染开发:
图像渲染的开发依赖于一系列通用标准接口。
“画笔”——OpenGL(Open Graphics Library) 是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。“小号画笔”——OpengGL ES(OpenGL for Embedded Systems) 是OpenGL的一个子集,针对手机、pad、游戏主机等嵌入式设备而设计,去除了许多不必要和性能较低的API接口。
“颜料”——GLSL(OpenGL Shading Language)是着色器的语言。
面向图形处理器编程的C风格语言,是OpenGL的一部分,着色器程序是运行在GPU上的程序,用于控制渲染流程中各个阶段的处理,大部分着色器是固定功能模块。有两种着色器程序是可编程的:顶点着色器和片元着色器。
“画布”——EGL(OpenGL ES Native Platform Graphics Interface)是 OpenGL ES 和本地窗口系统(native platform window system)之间的一个中间接口层,它主要由系统制造商实现。
基于以上API的组合,我们就可以实现丰富的渲染效果:
基于wayland协议,可以实现支持GPU加速的桌面系统:
并行计算原理:
由于硬件架构上的并行性设计,GPU天然适合于做并行计算的加速工作。不同于图像渲染,并行计算无需显示模块的配合,跳过内部的硬件渲染管线单元,直接调用计算核心单元,下图为渲染与并行计算的区别:
并行计算开发:
并行计算的开发依赖于通用标准接口OpenCL。
Open Computing Language(OpenCL)是开放计算语言,为异构平台提供了编写并行程序的框架标准,支持CPU、GPU、DSP、FPGA等异构平台上的不同处理器, 大大提高了代码的性能和可移植性。
OpenCL C是OpenCL中用于GPU运行的C风格语言,编写的程序我们称之为OpenCL kernel。通过编写kernel,我们可以实现各种算法的并行加速。
但是OpenCL程序的开发和优化具有一定的学习门槛,涉及到内存模型的概念以及内存拷贝问题,如果对硬件架构没有一定的了解,可能无法达到预期的加速效果,甚至会得到反效果。
那么有没有快速开发的方式?
1) 对于计算机视觉算法,我们可以通过OpenCV实现OpenCL调用,编译OpenCV库时添加-DWITH_OPENCL=YES选项使能OpenCL的加速,在原本的OpenCV代码中将Mat修改为UMat,默认会优先启动GPU OpenCL进行算法加速。
2)对于科学计算,提供了基于GPU的1D/2D/3D FFT加速库、1/2/3阶BLAS加速库以及示例程序。
3)对于轻量化神经网络,支持ARM NN、ARM Compute Library的适配,支持CPU(NEON)和GPU(OpenCL)同时开启机器学习加速效果。
以上加速使用的OpenCL kernel函数均开放源码,对自定义开发提供有力参考。由于常见的SOC芯片中GPU主要定位是图像渲染功能,和桌面级GPU相比算力有限,因此在并行计算方面的加速效果因算法而异,可以一定程度上减轻CPU负担,使用策略需要具体场景具体分析。
总结:
本文章大致介绍了GPU的基本原理和应用场景。如果读者希望进一步了解GPU的软件框架及开发流程,可以参考Khronos官方网站、Linux DRM框架或者各厂家的应用手册。如果对GPU的开发和部署感兴趣,我们会在未来更新进一步的介绍。
页:
[1]
