Qualcomm_Mobile_OpenCL.pdf 翻譯-3

3 在驍龍上使用OpenCL

         在今天安卓操做系統和IOT(Internet of Things)市場上,驍龍是性能最強的也是最被普遍使用的芯片。驍龍的手機平臺將最好的組件組合在一塊兒放到了單個芯片上,這樣保證了基於驍龍平臺的設備將帶來極致的功耗效率和集成的解決方案,從而帶來最新的手機用戶體驗。數組

        

         驍龍是一個多處理器系統,包含好比多模解調器(multimode modem),CPU,GPU,DSP,位置/GPS,多媒體,電源管理,RF,針對軟件和操做系統的優化,內存,可鏈接性(Wi-Fi,藍牙)等。緩存

 

         若是想了解當前包含驍龍處理器的消費設備清單,或者想知道關於驍龍處理器更多其餘方面的內容,請瀏覽網站 http://www.qualcomm.com/snapdragon/devices。Adreno GPUs 通常在渲染圖像的應用程序中使用,同時它也擁有通常處理器的處理大量計算複雜的任務的能力,好比圖像和音頻的處理、計算視覺。使用OpenCL執行數據並行的計算可以充分發揮GPU的能力。架構

 

3.1在驍龍上使用OpenCL

         Adreno A3x,A4x 和A5x 系列的GPUs 已經能充分支持OpenCL,而且已經徹底符合OpenCL標準。OpenCL有不一樣的版本和profiles,因此不一樣系列的Anreno GPUs可能支持不一樣的OpenCL版本,如表3-1所示:函數

         表3-1 支持OpenCL的Adreno GPUS佈局

GPU 系列性能

Adreno A3x優化

Adreno A4x網站

Adreno A5xspa

OpenCL version操作系統

1.1

1.2

2.0

OpenCL profile

Embedded

Full

Full

 

         除了支持的OpenCL的版本和profiles不一樣以外,不一樣的Adreno GPUs還可能有其餘的不一樣的性質,好比支持的擴展功能不一樣,支持的圖片對象最大維度不一樣等。能夠經過調用API函數clGetDeviceInfo獲取完整的設備細節信息。

        

3.2 Andreno GPU架構

         這章將從高層次的角度整體介紹一下Adreno中與OpenCL相關的架構。

3.2.1 與OpenCL相關的Adreno的架構

 

         圖3-1 A5x GPUs 中與OpenCL相關的架構

 

         Adreno GPUs支持許多圖像和計算API,包括OpenGL ES,OpenCL,DirectX和Vulkan等。圖3-1闡述了與OpenCL相關的Andreno A5x硬件整體架構,其中省略了圖像相關的硬件模塊。A5x和其餘Andreno系列的GPU有許多不一樣,可是在OpenCL上的差別很小。

         執行OpenCL的關鍵硬件模塊以下:

  •   SP ( Shader or Streaming processor 着色或者流媒體處理器(圖像渲染的相關名詞))
    • Andreno GPU的核心部分。包含了許多硬件模塊,包括算術邏輯單元(ALU),裝載/存儲單元,控制流單元,寄存器文件等。
    • 執行圖像的着色程序(好比三角着色,片斷着色,計算着色)(圖像渲染中使用的)和執行計算任務好比OpenCL kernels。
    • 每個SP對應一個或者多個OpenCL的計算單元。
    • 根據GPU的系列和等級不一樣,Adreno GPUs可能包含一個或者多個SP。低級的芯片組可能只有一個SP,高級的芯片組可能有更多的SP。在圖3-1中,只有一個SP。
    • 對於使用__read_write (OpenCL2.0的特性)限定詞定義的緩衝區對象和圖片對象,SP將經過L2緩存裝載和存儲。
    • 對於只讀的圖像對象,SP經過texture processor/L1 模塊來裝載數據。
  • TP(Texture processor 紋理處理器(圖像渲染的相關名詞)
    • 執行紋理操做,好比基於內核的請求進行紋理的獲取和過濾。
    • TP是與L1 cache結合在一塊兒,當出現紋理數據緩衝區未命中時,L1 cache從UCHE(Unified L2 Cache下面講)中獲取數據。
  •  Unified L2 Cache(UCHE)
    •  負責爲SP從緩衝區Buffer對象)對象存儲/裝載數據,負責爲L1 cache請求裝載圖像對象(Image對象)。(如圖3-1,就當SP請求從緩衝區裝載/存儲數據,經過UCHE ,當L1 cache請求裝載圖像對象時,經過UCHE

      3.2.2 Waves 和 fibers(高通內部定義的概念,直接用英文,具體意義會在章節中詳細解釋)

         在Adreno GPUs中,最小的執行單元叫fiber。一個fiber對應OpenCL中的一個work item(工做項,opencl中的概念,由於代碼中也會常常用到,因此直接用英文表示)。以「固定步調」一塊兒運行的一組fiber叫作wave。SP能夠同時容納多個已經激活的wave。每個wave與前面的程序獨立,而且與其餘waves的運行狀態無關。須要注意如下幾點:

  •  wave的大小,或者說是在一個wave中fbers的數量,對於指定的GPU和kernel,這個數量固定的。GPU給出最大值,kernel函數給出當前須要運行的值)
  •  在Adreno GPU中,wave的大小依賴於GPU的系列和編譯器,通常值是8,16,32,54,128等。
  • 一個workgroup(工做組,opencl中的概念)能夠被一個或者多個waves執行,這主要由workgroup的大小決定。好比說,若是一個workgroup的大小小於或者等於wave的大小,只須要一個wave就能夠。固然越多的wave固然越好,由於wave之間可以更好地隱藏延遲。(像cpu上的流水線,好比一個wave執行完load數據,開始計算,另外一個wave就能夠開始執行load數據操做。這樣第二個wave的load操做時間就被隱藏了。)
  • SP能夠在一個或者多個waves上同時執行ALU指令。
  • 在一個workgroup中,能夠流水線運行的最大的wave的個數是由硬件決定的。典型的,Adreno GPUs支持16個waves。
  • 給定一個kernel函數,在一個SP上能激活的最大waves的個數是由kernel的寄存器佔用和寄存器文件的大小決定(就是雖然硬件最大支持16個waves同時運行,可是若是kernel函數佔用寄存器過多,寄存器不夠用,可能只有8個waves同時運行),同時也由GPU的系列和等級決定。
  • 通常地,kernel函數越複雜,可激活的waves越小。(這裏提供了優化思路,將複雜的kernel函數拆成多個簡單的kernel函數,可以提升並行速度)
  • 給定一個kernel函數,最大的workgroup大小是wave的大小和容許的wave的最大個數的乘積。

         OpenCL 1.x的文檔中並無暴露wave上的概念,在OpenCL2.0中,已經容許應用程序經過cl_khr_subgroups擴展功能使用wave,不過是從Adreno A5x GPU開始支持的。

        

      3.2.3延遲隱藏

         延遲隱藏是GPU有效並行化處理中最強大的一個特色,使得GPU達到一個很高的吞吐量。舉例以下:

  • SP開始執行第1個wave。
  • 在執行完幾個ALU指令後,這個wave須要從外存中(多是全局/本地/私有內存)獲取更多的數據進行接下來的處理,而這些數據當前沒有獲取到。
  • SP爲這個wave發送數據獲取數據請求。
  • SP切換到已經準備好的第2個wave開始執行。
  • SP繼續執行第2個wave,直到第2個wave依賴的內容(好比數據或者寄存器之類)沒有準備好。
  • SP 可能會切換到第3個wave,或者切回到第1個wave執行,若是第一個wave已經可執行(數據已經獲取到)的話。

         在這種方式下,SP一直處於很是忙碌的狀態,並且就像是所有時間都在工做,或者說外部依賴項已經被很好隱藏了。

 

    3.2.4 workgroup的分配

         一個典型的OpenCL kernel須要用到多個workgroup。在Adreno GPU中,每個workgroup被分配給一個SP,通常地,在同一時間內每個SP只能運行一個workgroup。若是有剩下的workgroup,會在GPU中排隊等待執行。

         用圖3-2所示的2維workgroup爲例,並假設該GPU有4個SP。圖3-3表示了這些workgroup如何被分配到不一樣的SP上。在這個例子中,共有9個workgroup,而且每個都由一個SP上執行。每個workgroup有4個wave,wave的大小是16.

 

圖3-2  workgroup的佈局和分派到在Andreno GPU上執行的例子

 

圖3-3  workgroup被分配到SP上執行的例子

 

         OpenCL標準既沒有定義workgroup啓動和執行的順序,也沒有定義workgroup之間的同步機制。對於Adreno GPUs,開發者不能假設workgroup在SP上按照指定的順序啓動。一樣地,wave也不能假設按照指定的順序啓動。

 

         在大部分的Adreno GPUs中,一個SP在同一個時間只能運行一個workgroup,並且一個workgroup必須完成後,另外一個workgroup才能開始。可是在更高級和更新的GPU系列中,好比Adreno A540 GPU,一個SP上能夠執行多個workgroup。

3.3 Adreno A3x,A4x 和A5x在OpenCL上的不一樣點

         每個新的Adreno GPU系列將會在OpenCL的特性和性能上帶來很大的提高。這一章將討論影響OpenCL性能的關鍵改變。

      3.3.1 L2 cache

         從Adreno A320和Adreno 330 GPUs 到Adreno A420, A430,A530 和A540 GPUs,爲了更好的效率和性能,L2 cache的架構進行了極大的改進,同時還增長了L2 cahe的容量。

      3.3.2 Local memory本地內存

         從Adreno A3x 到A4x 和A5x 系列,Local memory在容量,裝載/存儲吞吐量和合並訪問(coalesced access)上有所提高。表3-2表示了在不一樣系列上合併訪問的不一樣點。

         表3-2 本地內存性能總結

GPUs

Adreno A3x

Adreno A4x

Adreno A5x

合併訪問

不支持

不支持

支持,每次操做能夠由最多4個work item裝載/存儲128位。

 

         合併訪問是OpenCL和GPU並行計算中的一個重要概念。從本質上說,它指的是,基礎硬件可以將多個work item的數據裝載/存儲請求合併成一個請求,從而提高數據的裝載/存儲效率。若是沒有合併訪問的支持,硬件必須針對每一個單獨的請求進行裝載和存儲的操做,這將會致使較差的性能。

         圖3-4 闡述了合併訪問和非合併訪問之間的不一樣。爲了可以將多個work items的請求結合在一塊兒,請求的數據地址必須是連續的。在合併訪問中,Adreno GPUs可以在一次處理中給4個work items裝載數據,而非合併訪問中,須要4次處理纔可以裝載一樣數量的數據。

 

         圖3-4 數據裝載中合併訪問 vs 非合併訪問

 

      3.4 圖像和計算任務之間的上下文切換

      3.4.1 上下文切換

         在Adreno GPUs中,若是一個高優先級的任務,好比圖像用戶界面(UI)渲染進行了請求,同時一個低優先級任務正在GPU上運行,那麼後者將會被暫停,而後GPU切換到高優先級的任務上執行。當高優先級的任務執行完畢,低優先級的任務將會被恢復。這種任務的切換叫作上下文切換。上下文切換是很是耗時的,由於須要複雜的硬件和軟件操做。然而,這又是很重要的一個特性,可以使得緊急的和對時間要求嚴格的任務及時完成,好比自動類的應用程序。

      3.4.2  限制kernel/workgroup在GPU上的執行時間

         有時候,一個計算任務的kernel函數可能會執行一段時間,或者可能會觸發一個警告而致使GPU重啓。爲了不這些不可預測的行爲,並不建議kernel函數中有須要長時間才能完成的workgroup。一般狀況下,在Android設備上,UI渲染常常發生,好比每30 ms,因此一個長時間運行的kernel可能會引發UI滯後或者沒有響應,從而致使用戶體驗很差。理想的kernel執行時間是根據實際狀況而定的。不過,一個比較好的通用準則是,一個kernel的執行時間應該在10ms的數量級上。

 

      3.5 OpenCL 標準上的相關提高

         Adreno A3x GPU支持OpenCL 1.1 的嵌入式版profile,Adreno A4x GPU支持OpenCL 1.2的完整版,Andreno A5x GPU上支持OpenCL 2.0 完整版。

 

         從OpenCL 1.1 的嵌入式版profile到OpenCL 1.2的完整版,主要的改變是在軟件上,而不是在硬件上,好比提高了API函數。

         不過,從OpenCL 1.2 的完整版到OpenCL 2.0的完整版,引進了許多新的硬件特性,好比SVM(共享的虛擬內存),kernel-enqueue-kernel,等。表3-3 列出了3個Adreno系列的GPU上,在OpenCL支持上的不一樣點。

         表3-3 在Adreno GPU上的支持的標準OpenCL的特性

        

特性

Adreno A3x支持的嵌入式OpenCL1.1

Adreno A4x 支持的徹底OpenCL1.2

Adreno A5x支持的完整OpenCL2.0

分開編譯和連接對象

不支持

不支持

支持

舍入模式

舍入爲0

舍入到最接近的偶數

舍入到最接近的偶數

kernel中編譯

不支持

支持

支持

1維的紋理,1維/2維的圖片數組

不支持

不支持

支持(僅在合併獲取時)

共享虛擬內存

不支持

不支持

支持

管道

不支持

不支持

支持

轉載/存儲圖像

不支持

不支持

支持

嵌套並行

不支持

不支持

支持

KEK(Kernel-enqueue-kernel)

不支持

不支持

支持

通用內存空間

不支持

不支持

支持

C++ 原子操做

不支持

不支持

支持

 

 

      3.6 OpenCL擴展

         除了支持OpenCL的核心功能外,Adreno OpenCL平臺還經過擴展支持許多額外的功能特性,從而可以進一步提升了OpenCL的可用性和可以充分使用Adreno GPU的先進的硬件能力。指定Adreno GPU上可用的擴展功能能夠經過函數clGetPlatformInfo函數查詢。擴展功能的文檔能夠在QTI開發者網頁上獲取。(網址 https://developer.qualcomm.com)

相關文章
相關標籤/搜索