1、简介
GPU(图形处理单元),是一种专门在个人电脑、工作站、游戏机和移动设备上图形运算工作的微处理器。以前GPU主要用于图形处理,现在GPU的通用计算技术也得到了飞速发展,事实证明在浮点运算、并行计算等部分计算方面,GPU可以提供数十倍乃至上百倍于CPU的性能。通用计算方面的标准有:OpenCl、CUDA、ATISTREAM。
其中,OpenCL(全称Open Computing Language,开放运算语言)是第一个面向异构系统通用目的并行编程的开放式、免费标准,也是一个统一的编程环境,便于软件开发人员为高性能计算服务器、桌面计算系统、手持设备编写高效轻便的代码,而且广泛适用于多核心处理器(CPU)、图形处理器(GPU)、Cell类型架构以及数字信号处理器(DSP)等其他并行处理器,在游戏、娱乐、科研、医疗等各种领域都有广阔的发展前景,AMD-ATI、NVIDIA时下的产品都支持Open CL。
GPU的生产厂商非常多,最大的三家是英特尔、NVIDIA、AMD,他们主要应用于PC领域。相比ARM CPU占据了移动端90%市场,ARM的mali GPU只是移动市场众多GPU的一小众,它主要应用基于ARM 体系结构的移动设备上,得益于CPU占有率发展迅猛。mali GPU最早由挪威科技大学项目独立出来成立的Falanx公司开发,在2006年被ARM收购,成为ARM一个GPU事业部,并在2007年mali作为arm的一部分,发布了mali-200 GPU ,如表格所示经历了三代架构:
第一代Utgard | 第二代Midgard | 第三代Bifrost |
Mali-200/300/400/450/470 | Mali-T600/T700/T800系列 | Mali-G3/G5/G7系列 |
按照性能划分:
高性能 | 中等 | 低功耗 |
Mali-G71/72 Mali-T860/T880 Mali-T760 | Mali-G51/G52 Mali-T820/T830 Mali-T720 | Mali-400/450/470 Mali-G31 |
Hi3536使用的是Mali-T720GPU,有如下特点:
总线接口AMBA@4 ACE-LITE
支持MMU
L2 Caches:64KB~256KB
可配置1~8 cores
支持 OpenGL ES 3.1/2.0/1.1
支持 OpenCL 1.1/1.0,RenderScript
支持DirectX 11 FL9_3
完全可编程的架构,灵活支持各种几何与像素处理算法,包括多种快速图元、纹
理、像素及模板处理功能
支持 ATSC 、 ETC2 等多种纹理压缩格式、输入输出格式(包括 YCbCr 数据格
式),可以对解码后的视频数据进行特效处理;
支持双精度 FP64 及抗锯齿功能
支持 DFS 功能
OpenGLES为嵌入式图形算法库,主要提供2D/3D图形处理的相应接口
OpenCL开放运行语言,是GPU用于通用计算开发的一个标准。例如人工智能,深度学习,人脸识别等通用计算就使用后者。
2、开发工具
arm提供了mali GPU各种使用场景下的调优、测试工具(需要用时再深入研究)。
(1)mali Graphics Debugger
针对采用ARM® Mali™ GPU的Android手机,进行app的GPU运行时调试和调优。
(2)mali Offline Compiler
用于OpenGL ES着色器和OpenCL kernels离线编译的一套命令行工具。
(3)Mali Texture Compression Tool
纹理压缩工具用于压缩ETC/ASTC格式的纹理
(4)OpenGL ES Emulator
OpenGLES仿真器是一个映射OpenGL ES调用到desktop OpenGL API的库。
(5)ASTC Evaluation Codec
ASTC评估编码器
(6)DS-5 Streamline
MaliGPU性能分析工具
3、开发文档
(1)开发指南
网址:https://developer.arm.com/graphics/developer-guides
包括如下文档:
Getting Started With Mali GPUs
Mali Best Practices
Unity Guide for Unity Developers
Arm Guide to OpenCl Programming //开发opencl的指导文件
OpenGL ES 3.X Developer Programming Guide
Arm Mali Gpu Application Optimizaton
Applicaton Developer Best Practices
Arm Guide for Unreal Engine 4 OptimizingMobile Gaming Graphics
(2)参考资料
网址:https://developer.arm.com/graphics/resources/tutorials
Unity Tutorials
VR Tutorials
Vulkan Tutorials
Android OpenGL ES 3.0&3.1 Tutorials
Arm Tools Tutorials
Performance and Optimization Tutorials
OpenCL Tutorials
GPU Compute Tutorials
Arm Architecture Tutorials
Unreal Engine Tutorials
Cocos2d-x Engine Tutorials
HTML 5 WebGL UI and Browser Tutorials
Mali Demos Tutorials
4、驱动和开发板
(1)驱动
网址:https://developer.arm.com/products/software/mali-drivers
Android NNAPI
Mali GPU User-Space Binary Drivers
Mali Bifrost GPUs Device Driver //bifrost架构设备驱动
Mali Midgard GPUs Device Driver //midgard架构设备驱动
Mali Utgard GPUs Device Driver //utgard架构设备驱动
Mali Video Kernel Device Driver
Android Gralloc Module Source Code //针对android
Mali GPU Android RenderScriptIntegration Modules //针对android
Mali-DP ADF Kernel Device Driver //针对android
Mali GPUs Linux EXA/DRI2 and X11 DisplayDrivers
Mali GPUs UMP User-Space Drivers
(2)官网开发板
网址:https://developer.arm.com/graphics/development-platforms
Firefly-RK3288
Hikey 960 board
Sansum Nexus 10
ODROID-XU3
Samsung Chromebook
5、官网提供的SDK
Mali VR SDK for Android
Mali Vulkan SDK
Mali OpenGL ES SDK
https://github.com/ARM-software/opengl-es-sdk-for-android
https://arm-software.github.io/opengl-es-sdk-for-android/
OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。它是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。
OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL三维图形 API 的子集,针对手机、PDA和游戏主机等嵌入式设备而设计。OpenGL ES 是从 OpenGL 裁剪的定制而来的,去除了glBegin/glEnd,四边形(GL_QUADS)、多边形(GL_POLYGONS)等复杂图元等许多非绝对必要的特性。经过多年发展,现在主要有两个版本,OpenGL ES 1.x 针对固定管线硬件的,OpenGL ES 2.x 针对可编程管线硬件。
Compute Library:
https://github.com/ARM-software/ComputeLibrary
https://arm-software.github.io/ComputeLibrary/latest/
ARM Compute Library是ARM公司刚发布不久的开源工程,旨在为图像/视频/多媒体/计算机视觉等领域的开发者提供arm平台的硬件加速库。这个库中分别用OpenCL与NEON的方式实现了一些上述领域的基本算法,OpenCL主要是arm的Mali GPU加速,NEON是针对arm的A系列CPU。开发者可以不用关心arm的cpu与gpu怎样通过NEON或OpenCL来实现硬件的加速,直接调用这个库中的接口就可以,对于开发计算机视觉类的应用但是不太了解硬件加速编程的工程师来说十分有利。
该库接口用C++实现,部分核心使用C语言实现。
6、驱动移植
Hi3536使用Mali-T720GPU属于Midgard结构,因此下载Mali Midgard GPUs Device Driver的linux版本,报名:TX011-SW-99002-r23p0-01rel0,进入到kernel目录如下:
该目录结构和linux内核src结构一致,将各个目录下的内容分别拷贝到linux src目录下。实际移植只拷贝了核心的drivers/gpu/arm整个目录到linux drivers/gpu目录下,然后修改src/drivers/video/Kconfig,添加arm的Kconfig,如图所示:
在src/drivers/gpu/arm/midgard/platform下面参考现有平台,添加自己的平台信息hi3536,修改mali_kbase_config_hi3536.c文件添加中断号,GPU寄存器空间等。
通过makemenuconfig配置mali GPU的选项,编译成模块或编译进内核:
Device Drivers --->
Graphicssupport --->
ARM GPU Configuration --->
<M>Mali Midgard series support --->
---Mali Midgard series support
[] Streamline support via Gator
[] Enable legacy DVFS
[] Enable kbase tracing
[] devfreq support for Mali
[] DMA_BUF fence support for Mali
(hi3536)Platform name
[] Enable Expert Settings --->
上面名字hi3536就是刚才添加的平台名字,编译时会自动将平台下的内容编译进去。
然后进入到根目录下编译模块makeuImage; make modules,在src/drivers/gpu/arm/midgard下就会生成一个mali_kbase.ko驱动。
拷贝mali_kbase.ko到板子上,insmodmali_kbase.ko后,如果检测到GPU会有相应打印,可惜在hi3536上未成功检测到,手动读取GPU寄存器信息也是失败的。