<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > Mali GPU編程特性及二維浮點(diǎn)矩陣運算并行優(yōu)化詳解

Mali GPU編程特性及二維浮點(diǎn)矩陣運算并行優(yōu)化詳解

作者: 時(shí)間:2017-10-20 來(lái)源:網(wǎng)絡(luò ) 收藏

  基于Mali-T604嵌入式GPU的二維浮點(diǎn)矩陣運算并行優(yōu)化

本文引用地址:http://dyxdggzs.com/article/201710/366814.htm

  ARM Cortex-A15系列處理器是當前最新的嵌入式ARM ,該系列處理器首次集成了Mali-T600系列的移動(dòng)端GPU,該系列GPU支持OpenGL以及等計算框架,可以有效加速通用計算,而目前對其應用方法和實(shí)際優(yōu)化效果的研究很少。本文基于以三星的Exynos5250處理器為核心的Arndale Board嵌入式開(kāi)發(fā)平臺,對集成于處理器上的Mali-T604嵌入式GPU的GPGPU(General-Purpose computation on GPU)技術(shù)進(jìn)行研究并對不同運算規模的浮點(diǎn)矩陣乘法進(jìn)行并行加速優(yōu)化,提供實(shí)際測試結果。

  GPGPU技術(shù)早年主要在超級計算機平臺進(jìn)行高性能計算,而近年該技術(shù)逐漸被引入嵌入式領(lǐng)域。但在過(guò)去的移動(dòng)GPU平臺上沒(méi)有專(zhuān)門(mén)針對通用計算的軟件框架和編程接口,軟件設計者難以對于數據的同步和計算的并行進(jìn)行控制,所以移動(dòng)GPU在通用計算領(lǐng)域一直難以應用。本文基于Exynos5250 平臺詳述Mali GPU的硬件特性和將其應用于通用計算的編程的方法,最后將二維浮點(diǎn)矩陣乘法并行化作為優(yōu)化實(shí)例,驗證Mali GPU的并行能力,為計劃使用嵌入式GPU的GPGPU技術(shù)進(jìn)行優(yōu)化工作的研究人員和應用開(kāi)發(fā)者提供技術(shù)參考和借鑒。

  1.Mali T604 GPU的硬件結構和編程特性

  Mali是由ARM研發(fā)設計的移動(dòng)顯示芯片組(GPUs)系列,不僅能夠在移動(dòng)端提供強大的圖像渲染能力,同時(shí)在近期對通用計算進(jìn)行了良好的軟硬件支支持。

  1.1 Mali T604 GPU的組成結構

  Mali-T604是Mali系列中首款使用統一渲染架構Midgard的移動(dòng)GPU,Mali-T604 GPU包含4個(gè)著(zhù)色器核心,采用AMBA 4 ACE-LITE總線(xiàn)接口,該總線(xiàn)以Cache Coherent Interconnect技術(shù)為特色,在多個(gè)處理器之間提供完全Cache一致性,通過(guò)ARM的一致性和互連技術(shù),計算任務(wù)在異構系統中進(jìn)行共享處理時(shí),可以輕松跨越CPU、GPU和其他可用計算資源,更高效地訪(fǎng)問(wèn)數據。圖1展示了Mali-T604 GPU的基本框架。如圖2所示,Cortex-A15 CPU核心以及Mali GPU核心物理上共享了片外的RAM存儲器并保持了L2Cache的一致性。

  

  圖1 Mali-T604基本硬件框圖

  

  圖2 Exynos5250處理器框圖

  Mali-T604 GPU在硬件層面優(yōu)化了對任務(wù)管理和事件依賴(lài)的處理,并將這部分功能完全集成在其硬件的任務(wù)管理單元之中,可將計算任務(wù)從CPU卸載到GPU,并在活動(dòng)的著(zhù)色器核心之間實(shí)現無(wú)縫負載平衡。

  1.2 Mali GPU的并行化線(xiàn)程結構特征

  Mali GPU進(jìn)行通用計算的技術(shù)核心是以多核多線(xiàn)程的思想將密集的計算任務(wù)進(jìn)行拆解,將大量的計算線(xiàn)程分配于眾多計算核心中,GPU可以同時(shí)處理成百上千的線(xiàn)程,大量晶體管用于A(yíng)LU.GPU適合做高密度數據的并行運算,只有在運算的并行粒度足夠大的時(shí)候才能發(fā)揮出強大的并行運算能力。圖3展示了CPU和 Mali GPU之間工作調配的過(guò)程。

  

  圖3 Cortex-A15 CPU和Mali GPU之間的工作調配

  Mali GPU中每個(gè)計算線(xiàn)程會(huì )占用著(zhù)色器核心的一部分資源(存儲器和ALU等),每個(gè)線(xiàn)程占用資源的多少影響了同時(shí)并行處理的活動(dòng)線(xiàn)程的數量。對Mali GPU,每一個(gè)線(xiàn)程都有自己的程序計數器,這意味著(zhù)Mali GPU和桌面GPU平臺不同,程序分支的發(fā)散不是一個(gè)影響效率的重要的問(wèn)題。每個(gè)Mali-T604 GPU的著(zhù)色器核心最多可以同時(shí)容納256個(gè)線(xiàn)程,Mali GPU在進(jìn)行通用計算時(shí)需要大量的線(xiàn)程進(jìn)行切換才能保證得到計算效率上的收益,對于Mali-T604而言,這個(gè)最少的總工作項數量是4096.如果分配于單個(gè)著(zhù)色器核心上的線(xiàn)程數目不足128,很可能帶來(lái)并行效率的下降,這時(shí)需要拆分工作為不同的步驟,簡(jiǎn)化每個(gè)步驟的線(xiàn)程復雜度,讓單個(gè)著(zhù)色器核心并行容納的線(xiàn)程數量足夠多以保證并行度。

  2.Mali GPU的并行化計算模型構建

  Mali-T600系列的GPU對 1.1 Full Profile標準進(jìn)行了良好的支持,是真正意義上的跨平臺異構并行框架,能夠真正挖掘出Mali GPU的并行計算特性。

  2.1 Mali GPU在OpenCL框架下的并行任務(wù)抽象及線(xiàn)程規劃

  OpenCL是一個(gè)由編程語(yǔ)言規范,應用程序接口、庫函數和運行時(shí)系統組成的跨平臺異構并行計算框架,Mali-T604 GPU在OpenCL下的抽象層次如下面的圖4所示:

  

  圖4 OpenCL針對Mali-T604的抽象層次

  OpenCL的并行基于SMT(同時(shí)多線(xiàn)程)的思想,由用戶(hù)指定自定義數目的線(xiàn)程,并根據線(xiàn)程的標識符設計計算線(xiàn)程與數據關(guān)聯(lián)的映射法則,SMT架構主要用于隱蔽訪(fǎng)存的延時(shí)。OpenCL框架下,CPU主機端程序由OpenCL的API編寫(xiě),實(shí)現計算平臺的初始化,存儲器的分配和交互的控制,并決定分配的計算線(xiàn)程的維度和每一維的數量。設備端的內核程序由OpenCL C語(yǔ)言編寫(xiě),Mali GPU會(huì )根據內核對象創(chuàng )建主機端請求數量的線(xiàn)程實(shí)例,每個(gè)線(xiàn)程的運算工作都由圖4中一個(gè)對應的PE進(jìn)行處理,線(xiàn)程的工作邏輯決定了線(xiàn)程標識號和數據的關(guān)聯(lián)關(guān)系。多個(gè)線(xiàn)程被組織為工作組的形式,每一個(gè)工作組固定分配到一個(gè)CU上進(jìn)行處理,同一個(gè)工作組中的線(xiàn)程會(huì )在對應的CU上由Mali GPU的任務(wù)管理單元進(jìn)行快速的切換和調度,保證一個(gè)CU上的PE最大限度保持忙碌。

  2.2 Mali GPU多核環(huán)境下的存儲器空間映像方法

  如圖4所示,Mali GPU和Cortex A15 CPU所共用的RAM在邏輯上被OpenCL框架切割成了四種不同的類(lèi)型,Mali-T600系列的GPU使用統一存儲器模型,四種類(lèi)型的存儲器都映射到片外RAM上,Cortex-A15 CPU和Mali-T604 GPU共享物理RAM,相對桌面GPU平臺而言,在Mali平臺上將數據從全局存儲器拷貝到局部或者私有存儲器并不能使訪(fǎng)存性能得到提升,但相對地也不用像桌面GPU一樣進(jìn)行從主存到顯存的數據拷貝。Mali GPU有三種訪(fǎng)問(wèn)RAM的方式,由傳入clCreateBuffer函數中的不同參數決定,其示意圖如下:

  

  圖5 OpenCL框架下Mali GPU對存儲器的不同訪(fǎng)問(wèn)方式

  Cortex-A15 CPU和Mali-T604 GPU使用不同的虛擬地址空間,在主機端由malloc函數分配的緩存,Mali GPU無(wú)法訪(fǎng)問(wèn)。Mali GPU可以訪(fǎng)問(wèn)clCreateBuffer函數分配出的緩存,CPU借助OpenCL中的map映射操作也可實(shí)現對這類(lèi)緩存的讀寫(xiě),圖5中的方式2需要主機端的緩存進(jìn)行數據拷貝來(lái)初始化,方式3和方式2類(lèi)似,但只在OpenCL的內核函數首次使用該緩存時(shí)才進(jìn)行數據拷貝,在CPU端進(jìn)行map操作時(shí) GPU還會(huì )將數據拷貝回主機端的緩存,對于Mali GPU而言,多余的數據拷貝操作會(huì )降低訪(fǎng)存效率。圖5中的方式1是ARM官方建議的訪(fǎng)存方式,CPU和GPU共享一塊物理緩存,高速實(shí)現數據交互。

  2.3 Mali GPU的向量處理特性

  Mali-T604 GPU內部有128位寬度的向量寄存器,使用OpenCL C中的內建向量類(lèi)型可以讓數據自動(dòng)以SIMD的形式在Mali GPU的ALU中進(jìn)行并行計算,Mali GPU中將數據以16個(gè)字節對齊可以使得數據的長(cháng)度和高速緩存適配,加快數據存取速度,Mali-T600系列GPU中加載一個(gè)128位的向量和加載一個(gè)單字節數據花費的時(shí)間是一樣的。將數據以128位進(jìn)行對齊,能夠最大限度發(fā)揮Mali-T604 GPU的訪(fǎng)存和運算效率。

  3.基于Mali-T604 GPU的快速浮點(diǎn)矩陣乘法并行化實(shí)現

  矩陣乘法運算在路徑方案求解、線(xiàn)性方程組求解、圖像處理等領(lǐng)域一直有著(zhù)廣泛應用,普通的迭代式串行算法的時(shí)間復雜度為O(n3),對于大型的矩陣乘法,特別是浮點(diǎn)類(lèi)型的矩陣乘法,計算量非常驚人,傳統的算法基于CPU進(jìn)行設計,CPU并不能提供大型的并行度和強大的浮點(diǎn)計算能力,對于大型浮點(diǎn)類(lèi)型矩陣乘法的處理力不從心。

  AB兩個(gè)矩陣的乘法的結果矩陣中的每個(gè)數據均依賴(lài)于A(yíng)中的一行和B中的一列的點(diǎn)積結果,每個(gè)計算結果沒(méi)有依賴(lài)和相關(guān),顯然是高度可數據并行的計算問(wèn)題,很適合使用GPU做并行處理,使用GPU上的多個(gè)線(xiàn)程可以并行進(jìn)行矩陣A和B中不同行和列的點(diǎn)積。

  實(shí)際進(jìn)行實(shí)驗時(shí),以N*N的兩個(gè)浮點(diǎn)矩陣A和B進(jìn)行乘法,得出N*N的浮點(diǎn)結果矩陣matrixResult,利用Mali GPU進(jìn)行并行化的時(shí)候,總共分配N(xiāo)*N個(gè)線(xiàn)程,以二維方式進(jìn)行排布,標識號為(i,j)的線(xiàn)程提取出矩陣matrixA的第i行和矩陣matrixB的第j列,利用OpenCL中長(cháng)度為128位的float4向量類(lèi)型快速實(shí)現兩個(gè)一維向量的點(diǎn)積,再將該點(diǎn)積結果存儲到matrixResult[i] [j]位置。主機端分配線(xiàn)程的代碼段如下:

  

  筆者將clEnqueueNDRangeKernel函數中工作組大小參數設置為NULL,由Mali GPU硬件自動(dòng)確定最佳的工作組大小。由于內核中每次會(huì )連續讀取4個(gè)浮點(diǎn)數值湊成float4類(lèi)型的數據,所以對于矩陣的寬度不是4的倍數的情況需要進(jìn)行特殊處理,可在主機端首先將輸入矩陣A修改為N行N/4+4列,將矩陣B修改為N/4+4行N列,多出的矩陣部分均以0補齊,這樣既不影響計算結果,也不會(huì )影響線(xiàn)程的分配方案,實(shí)現并行方案的內核函數如下所示:

  

  本文采用Arndale Board開(kāi)發(fā)板作為測試平臺,軟件平臺采用Linaro機構為Arndale Board定制的基于Ubuntu的嵌入式操作系統,其內核版本為3.10.37,實(shí)驗時(shí)使用arm-linux-gnueabihf工具鏈對程序進(jìn)行編譯。不同規模的二維浮點(diǎn)矩陣乘法運算在A(yíng)RM Cortex-A15 CPU上的串行方案和Mali-T604 GPU上的并行方案的測試結果如面的表1所示,為不失一般性,測試時(shí)輸入矩陣內容為隨機值,每種不同矩陣大小的測試項進(jìn)行10次測試,將測試值的平均值作為測試結果。

  

  上表僅列出了輸入量較大時(shí)的測試結果,筆者實(shí)際測試時(shí),發(fā)現輸入數據量較小的時(shí)候,并行方案沒(méi)有串行方案的效率高,因為計算過(guò)程大部分都消耗在數據的傳輸上,由于計算量小,GPU端的計算瞬間完成,沒(méi)有辦法將Mali GPU訪(fǎng)存的延遲掩蓋,所以此時(shí)訪(fǎng)存速度較快的CPU端的串行方案反而效率更高。

  當計算量逐步增加的時(shí)候,Mali GPU的并行能力逐漸體現出其優(yōu)勢,加速比有顯著(zhù)提升,當計算量大到一定程度的時(shí)候,加速比趨于穩定,因為這時(shí)Mali GPU上有大量的線(xiàn)程切換,不僅隱蔽了訪(fǎng)存的延遲,也使得Mali GPU上的計算單元滿(mǎn)載,其計算效率已達到硬件能夠承受的極限,此時(shí)Mali GPU可以提接近40倍的供驚人的加速比。

  實(shí)際測試時(shí),筆者使用top指令觀(guān)察矩陣進(jìn)程的CPU占用量,串行方案的CPU占用量在98%左右,而基于Mali GPU的并行方案對CPU幾乎沒(méi)有占用量,說(shuō)明并行方案不僅可以提升計算效率,還降低了CPU的負擔,大大提升了系統實(shí)時(shí)性。實(shí)驗的實(shí)際測試結果和GPU 異構運算特點(diǎn)吻合。

  4.結語(yǔ)

  本文針對Mali-T604 GPU論述了基于OpenCL的平臺上進(jìn)行通用計算并行優(yōu)化的方法,論述了Mali-T604 GPU的硬件特點(diǎn),并基于OpenCL設計了二維矩陣乘法的并行方案,在Mali-T604上獲得了驚人的加速比,結果表明Mali GPU對于龐大輸入量的計算密集型高度可數據并行化通用計算問(wèn)題有顯著(zhù)的加速能力,且并行優(yōu)化結果正確可靠。



關(guān)鍵詞: Linux OpenCL SoC

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>