在今天安卓操做系統和IOT(Internet of Things)市場上,驍龍是性能最強的也是最被普遍使用的芯片。驍龍的手機平臺將最好的組件組合在一塊兒放到了單個芯片上,這樣保證了基於驍龍平臺的設備將帶來極致的功耗效率和集成的解決方案,從而帶來最新的手機用戶體驗。數組
驍龍是一個多處理器系統,包含好比多模解調器(multimode modem),CPU,GPU,DSP,位置/GPS,多媒體,電源管理,RF,針對軟件和操做系統的優化,內存,可鏈接性(Wi-Fi,藍牙)等。緩存
若是想了解當前包含驍龍處理器的消費設備清單,或者想知道關於驍龍處理器更多其餘方面的內容,請瀏覽網站 http://www.qualcomm.com/snapdragon/devices。Adreno GPUs 通常在渲染圖像的應用程序中使用,同時它也擁有通常處理器的處理大量計算複雜的任務的能力,好比圖像和音頻的處理、計算視覺。使用OpenCL執行數據並行的計算可以充分發揮GPU的能力。架構
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獲取完整的設備細節信息。
這章將從高層次的角度整體介紹一下Adreno中與OpenCL相關的架構。
圖3-1 A5x GPUs 中與OpenCL相關的架構
Adreno GPUs支持許多圖像和計算API,包括OpenGL ES,OpenCL,DirectX和Vulkan等。圖3-1闡述了與OpenCL相關的Andreno A5x硬件整體架構,其中省略了圖像相關的硬件模塊。A5x和其餘Andreno系列的GPU有許多不一樣,可是在OpenCL上的差別很小。
執行OpenCL的關鍵硬件模塊以下:
在Adreno GPUs中,最小的執行單元叫fiber。一個fiber對應OpenCL中的一個work item(工做項,opencl中的概念,由於代碼中也會常常用到,因此直接用英文表示)。以「固定步調」一塊兒運行的一組fiber叫作wave。SP能夠同時容納多個已經激活的wave。每個wave與前面的程序獨立,而且與其餘waves的運行狀態無關。須要注意如下幾點:
OpenCL 1.x的文檔中並無暴露wave上的概念,在OpenCL2.0中,已經容許應用程序經過cl_khr_subgroups擴展功能使用wave,不過是從Adreno A5x GPU開始支持的。
延遲隱藏是GPU有效並行化處理中最強大的一個特色,使得GPU達到一個很高的吞吐量。舉例以下:
在這種方式下,SP一直處於很是忙碌的狀態,並且就像是所有時間都在工做,或者說外部依賴項已經被很好隱藏了。
一個典型的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。
每個新的Adreno GPU系列將會在OpenCL的特性和性能上帶來很大的提高。這一章將討論影響OpenCL性能的關鍵改變。
從Adreno A320和Adreno 330 GPUs 到Adreno A420, A430,A530 和A540 GPUs,爲了更好的效率和性能,L2 cache的架構進行了極大的改進,同時還增長了L2 cahe的容量。
從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 非合併訪問
在Adreno GPUs中,若是一個高優先級的任務,好比圖像用戶界面(UI)渲染進行了請求,同時一個低優先級任務正在GPU上運行,那麼後者將會被暫停,而後GPU切換到高優先級的任務上執行。當高優先級的任務執行完畢,低優先級的任務將會被恢復。這種任務的切換叫作上下文切換。上下文切換是很是耗時的,由於須要複雜的硬件和軟件操做。然而,這又是很重要的一個特性,可以使得緊急的和對時間要求嚴格的任務及時完成,好比自動類的應用程序。
有時候,一個計算任務的kernel函數可能會執行一段時間,或者可能會觸發一個警告而致使GPU重啓。爲了不這些不可預測的行爲,並不建議kernel函數中有須要長時間才能完成的workgroup。一般狀況下,在Android設備上,UI渲染常常發生,好比每30 ms,因此一個長時間運行的kernel可能會引發UI滯後或者沒有響應,從而致使用戶體驗很差。理想的kernel執行時間是根據實際狀況而定的。不過,一個比較好的通用準則是,一個kernel的執行時間應該在10ms的數量級上。
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++ 原子操做 |
不支持 |
不支持 |
支持 |
除了支持OpenCL的核心功能外,Adreno OpenCL平臺還經過擴展支持許多額外的功能特性,從而可以進一步提升了OpenCL的可用性和可以充分使用Adreno GPU的先進的硬件能力。指定Adreno GPU上可用的擴展功能能夠經過函數clGetPlatformInfo函數查詢。擴展功能的文檔能夠在QTI開發者網頁上獲取。(網址 https://developer.qualcomm.com)