微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > MCU和DSP > 实战技巧,Mali GPU编程特性及二维浮点矩阵运算并行优化详解

实战技巧,Mali GPU编程特性及二维浮点矩阵运算并行优化详解

时间:10-27 来源:互联网 点击:
  基于Mali-T604嵌入式GPU的二维浮点矩阵运算并行优化
  ARM Cortex-A15系列处理器是当前最新的嵌入式ARM SoC,该系列处理器首次集成了Mali-T600系列的移动端GPU,该系列GPU支持OpenGL以及OpenCL等计算框架,可以有效加速通用计算,而目前对其应用方法和实际优化效果的研究很少。本文基于以三星的Exynos5250处理器为核心的Arndale Board嵌入式开发平台,对集成于处理器上的Mali-T604嵌入式GPU的GPGPU(General-Purpose computation on GPU)技术进行研究并对不同运算规模的浮点矩阵乘法进行并行加速优化,提供实际测试结果。
  GPGPU技术早年主要在超级计算机平台进行高性能计算,而近年该技术逐渐被引入嵌入式领域。但在过去的移动GPU平台上没有专门针对通用计算的软件框架和编程接口,软件设计者难以对于数据的同步和计算的并行进行控制,所以移动GPU在通用计算领域一直难以应用。本文基于Exynos5250 SoC平台详述Mali GPU的硬件特性和将其应用于通用计算的编程的方法,最后将二维浮点矩阵乘法并行化作为优化实例,验证Mali GPU的并行能力,为计划使用嵌入式GPU的GPGPU技术进行优化工作的研究人员和应用开发者提供技术参考和借鉴。
  1.Mali T604 GPU的硬件结构和编程特性
  Mali是由ARM研发设计的移动显示芯片组(GPUs)系列,不仅能够在移动端提供强大的图像渲染能力,同时在近期对通用计算进行了良好的软硬件支支持。
  1.1 Mali T604 GPU的组成结构
  Mali-T604是Mali系列中首款使用统一渲染架构Midgard的移动GPU,Mali-T604 GPU包含4个着色器核心,采用AMBA 4 ACE-LITE总线接口,该总线以Cache Coherent Interconnect技术为特色,在多个处理器之间提供完全Cache一致性,通过ARM的一致性和互连技术,计算任务在异构系统中进行共享处理时,可以轻松跨越CPU、GPU和其他可用计算资源,更高效地访问数据。图1展示了Mali-T604 GPU的基本框架。如图2所示,Cortex-A15 CPU核心以及Mali GPU核心物理上共享了片外的RAM存储器并保持了L2Cache的一致性。
  


  图1 Mali-T604基本硬件框图
  


  图2 Exynos5250处理器框图
  Mali-T604 GPU在硬件层面优化了对任务管理和事件依赖的处理,并将这部分功能完全集成在其硬件的任务管理单元之中,可将计算任务从CPU卸载到GPU,并在活动的着色器核心之间实现无缝负载平衡。
  1.2 Mali GPU的并行化线程结构特征
  Mali GPU进行通用计算的技术核心是以多核多线程的思想将密集的计算任务进行拆解,将大量的计算线程分配于众多计算核心中,GPU可以同时处理成百上千的线程,大量晶体管用于ALU.GPU适合做高密度数据的并行运算,只有在运算的并行粒度足够大的时候才能发挥出强大的并行运算能力。图3展示了CPU和Mali GPU之间工作调配的过程。
  


  图3 Cortex-A15 CPU和Mali GPU之间的工作调配
  Mali GPU中每个计算线程会占用着色器核心的一部分资源(存储器和ALU等),每个线程占用资源的多少影响了同时并行处理的活动线程的数量。对Mali GPU,每一个线程都有自己的程序计数器,这意味着Mali GPU和桌面GPU平台不同,程序分支的发散不是一个影响效率的重要的问题。每个Mali-T604 GPU的着色器核心最多可以同时容纳256个线程,Mali GPU在进行通用计算时需要大量的线程进行切换才能保证得到计算效率上的收益,对于Mali-T604而言,这个最少的总工作项数量是4096.如果分配于单个着色器核心上的线程数目不足128,很可能带来并行效率的下降,这时需要拆分工作为不同的步骤,简化每个步骤的线程复杂度,让单个着色器核心并行容纳的线程数量足够多以保证并行度。
  2.Mali GPU的并行化计算模型构建
  Mali-T600系列的GPU对OpenCL 1.1 Full Profile标准进行了良好的支持,OpenCL是真正意义上的跨平台异构并行框架,能够真正挖掘出Mali GPU的并行计算特性。
  2.1 Mali GPU在OpenCL框架下的并行任务抽象及线程规划
  OpenCL是一个由编程语言规范,应用程序接口、库函数和运行时系统组成的跨平台异构并行计算框架,Mali-T604 GPU在OpenCL下的抽象层次如下面的图4所示:
  


  图4 OpenCL针对Mali-T604的抽象层次
  OpenCL的并行基于SMT(同时多线程)的思想,由用户指定自定义数目的线程,并根据线程的标识符设计计算线程与数据关联的映射法则,SMT架构主要用于隐蔽访存的延时。OpenCL框架下,CPU主机端程序由OpenCL的API编写,实现计算平台的初始化,存储器的分配和交互的控制,并决定分配的计算线程的维度和每一维的数量。设备端的内核程序由OpenCL C语言编写,Mali GPU会根据内核对象创建主机端请求数量的线程实例,每个线程的运算工作都由图4中一个对应的PE进行处理,线程的工作逻辑决定了线程标识号和数据的关联关系。多个线程被组织为工作组的形式,每一个工作组固定分配到一个CU上进行处理,同一个工作组中的线程会在对应的CU上由Mali GPU的任务管理单元进行快速的切换和调度,保证一个CU上的PE最大限度保持忙碌。
  2.2 Mali GPU多核环境下的存储器空间映像方法
  如图4所示,Mali GPU和Cortex A15 CPU所共用的RAM在逻辑上被OpenCL框架切割成了四种不同的类型,Mali-T600系列的GPU使用统一存储器模型,四种类型的存储器都映射到片外RAM上,Cortex-A15 CPU和Mali-T604 GPU共享物理RAM,相对桌面GPU平台而言,在Mali平台上将数据从全局存储器拷贝到局部或者私有存储器并不能使访存性能得到提升,但相对地也不用像桌面GPU一样进行从主存到显存的数据拷贝。Mali GPU有三种访问RAM的方式,由传入clCreateBuffer函数中的不同参数决定,其示意图如下:
  


  图5 OpenCL框架下Mali GPU对存储器的不同访问方式
  Cortex-A15 CPU和Mali-T604 GPU使用不同的虚拟地址空间,在主机端由malloc函数分配的缓存,Mali GPU无法访问。Mali GPU可以访问clCreateBuffer函数分配出的缓存,CPU借助OpenCL中的map映射操作也可实现对这类缓存的读写,图5中的方式2需要主机端的缓存进行数据拷贝来初始化,方式3和方式2类似,但只在OpenCL的内核函数首次使用该缓存时才进行数据拷贝,在CPU端进行map操作时GPU还会将数据拷贝回主机端的缓存,对于Mali GPU而言,多余的数据拷贝操作会降低访存效率。图5中的方式1是ARM官方建议的访存方式,CPU和GPU共享一块物理缓存,高速实现数据交互。
  2.3 Mali GPU的向量处理特性
  Mali-T604 GPU内部有128位宽度的向量寄存器,使用OpenCL C中的内建向量类型可以让数据自动以SIMD的形式在Mali GPU的ALU中进行并行计算,Mali GPU中将数据以16个字节对齐可以使得数据的长度和高速缓存适配,加快数据存取速度,Mali-T600系列GPU中加载一个128位的向量和加载一个单字节数据花费的时间是一样的。将数据以128位进行对齐,能够最大限度发挥Mali-T604 GPU的访存和运算效率。
  3.基于Mali-T604 GPU的快速浮点矩阵乘法并行化实现
  矩阵乘法运算在路径方案求解、线性方程组求解、图像处理等领域一直有着广泛应用,普通的迭代式串行算法的时间复杂度为O(n3),对于大型的矩阵乘法,特别是浮点类型的矩阵乘法,计算量非常惊人,传统的算法基于CPU进行设计,CPU并不能提供大型的并行度和强大的浮点计算能力,对于大型浮点类型矩阵乘法的处理力不从心。
  AB两个矩阵的乘法的结果矩阵中的每个数据均依赖于A中的一行和B中的一列的点积结果,每个计算结果没有依赖和相关,显然是高度可数据并行的计算问题,很适合使用GPU做并行处理,使用GPU上的多个线程可以并行进行矩阵A和B中不同行和列的点积。
  实际进行实验时,以N*N的两个浮点矩阵A和B进行乘法,得出N*N的浮点结果矩阵matrixResult,利用Mali GPU进行并行化的时候,总共分配N*N个线程,以二维方式进行排布,标识号为(i,j)的线程提取出矩阵matrixA的第i行和矩阵matrixB的第j列,利用OpenCL中长度为128位的float4向量类型快速实现两个一维向量的点积,再将该点积结果存储到matrixResult[j]位置。主机端分配线程的代码段如下:
  

                               

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top