GPU程式設計模型

2021-08-16 04:45:12 字數 3324 閱讀 2615

gpu(graphical processing unit)是顯示卡內用於圖形處理的器件。和cpu相比,cpu是序列執行,而gpu是多個核並行執行。gpu是乙個高效能的多核處理器,有很高的計算速度和資料吞吐率。在gpu上的運算能獲得相對於cpu而言很高的加速比。第

一、第二代gpu出現的時候,gpu不是可程式設計的[4]。當第三代gpu出現的時候,gpu開始用於圖形程式設計,研究者們給gpu燒製程式,進行影象處理。gpu的並行流處理能力吸引了平行計算的研究者,研究者們借助圖形程式設計的概念,把計算操作轉化成圖形紋理操作。這個時候gpu計算,需要對圖形概念有比較深的了解,程式設計比較複雜。***gpu以nvidia的geforce系列顯示卡為代表,開始提供專門用於通用計算的技術,並且出現了cuda[17]、opencl[6]等基於c語言的通用程式語言。gpu用於平行計算的技術稱為gpgpu(general purpose gpu)[4]。gpgpu涉及的範圍很廣,包括了幾何計算、蛋白質模擬、優化計算、偏微分方程等。

在gpu程式設計的硬體結構中,整體裝置被分為兩個部分。第乙個部分是控制裝置,稱為host(主機)。第二部分是計算裝置,稱為device。

host 負責管理gpu的執行,以及資源的分配管理。準確的說,研究者是通過和host交流,來控制gpu。host通過opencl api 來和計算裝置互動。host是執行於cpu上的。執行於host上的程式稱為host program。

計算裝置的整體又劃分了很多的計算單元(compute unit)。每個計算單元有一些共享資源,同乙個計算單元內的處理元可以實現同步。每個計算單元又劃分成若干個處理元。真正的計算發生在處理元上。執行在每個處理元上的例項稱為kernel。

假設有n個計算單元,每個計算單元有m個處理元。那麼總共有n*m個核。同一時刻,就可以再裝置上執行n*m個例項。因此,如果不考慮i/o等其他因素,加速比的理論上限是n*m。

圖 2-1 gpu硬體抽象模型

圖2-2 opencl程式設計模型

opencl把整個計算裝置的空間劃分成n維(n=1、2、3),稱為ndrange。每乙個維度上的又劃分成若干個工作組(work group),每個工作組又包含了若干個工作單元(work item)。在每乙個維度內,每乙個工作組都有乙個唯一group id標識。每乙個工作單元都有乙個唯一的global id。在每乙個維度的每乙個工作組內,每個工作單元都有乙個唯一的local id標識。每乙個工作單元的global id可以和所屬工作組的group id和local id換算。

和上一小節相比,在上一小節中提到的計算單元和處理元的概念都是硬體概念。而本小節提到的維度、工作組、工作單元的概念是抽象概念,和硬體概念之間沒有關聯。每乙個工作單元,可以由乙個或者多個處理元構成。

每乙個維度上的每個工作組的大小有一定的限制 ,所有維度內屬於同乙個工作組的工作單元的數目不能超過硬體乙個計算機群的大小。假設每個維度的工作組大小分別是n1,n2,n3,計算單元的大小是size,那麼有n1*n2*n3<=size。

圖2-2中展示的是乙個二維空間。其形式類似於二維矩陣,只是每個維度上還有工作組的概念。

opencl的儲存根據作用域可以分成四個級別。依次是:全域性記憶體,常量記憶體,區域性記憶體,私有記憶體。

全域性記憶體,對於所有工作組內的所有工作單元都可讀和可寫。但是對這部分記憶體的讀寫可能會被快取,因此多個處理單元處理同一塊記憶體時,要注意進行同步。

常量記憶體,作用域和全域性記憶體一樣,但是只可讀,不可寫。全域性記憶體和常量記憶體都是由host進行分配空間和初始化的。

區域性記憶體,顧名思義,只對部分處理單元可操作。其作用域在同乙個工作組內。這部分的硬體位於計算單元內部。

私有記憶體,僅限於單個工作單元可讀寫,其硬體位於處理單元內部。通常,在工作單元上執行的kernel例項,其函式區域性變數是分配在私有記憶體上的。

opencl的全域性記憶體通常用於放置gpu的入口引數,以及gpu的執行結果。opencl的程式本身是不提供返回值的,因此如果要獲得返回值,就需要把執行結果放入全域性記憶體。在程式結束後,由host程式讀取全域性記憶體區的資料,從而獲得返回值。

對於opencl而言,有兩種型別的執行方式,第一種是任務並行模型,第二種是資料並行模型。

任務並行模型是指,每個工作單元內,執行乙個kernel例項,但是不同的單元執行的例項可能不一樣。

資料並行模型是指,每個工作單元內,執行的是同乙個kernel例項,只是每個單元處理的資料不一樣,由於每個單元都有乙個唯一的id標識,所以,可以通過這個id來指定這個單元處理的是哪些資料。

在遺傳演算法的實現方式中,本文採取了資料並行模型。

在遺傳演算法中,對於每一次迭代,有些操作需要等待所有的工作單元完成後才能進行。比如,對於傳統遺傳演算法,在選擇操作前,需要所有的個體同時完成個體適應值的評價。因此需要同步操作。

在opencl中,存在乙個api:barrier(cl_mem_fence_flag)。標誌位有兩個選項,local_mem_fence 和global_mem_fence,分別用於同步區域性記憶體和全域性記憶體。同步的處理單元必須在等待所有的處理單元都執行到該函式時,才能執行下一條語句。

然而,正如前文講到的,乙個工作組的大小是有限制的,這個限制就是乙個計算單元的大小。計算單元的劃分是硬體限制,屬於同乙個計算單元的處理單元共享計算單元內的記憶體和其他資源。gpu對同步的實現也依賴於硬體,因此,只有屬於同乙個計算單元的處理單元才能夠實現同步。對於程式開發者而言,opencl弱化了硬體架構,開發者只知道工作組這一概念,不清楚計算機群這一概念。因此,opencl的同步只發生在同乙個工作組中。

在遺傳演算法中,隨機過程往往需要很大的基數才能保證一些小概率事件的發生。比如變異操作,這個操作的概率很小,如果樣本數量小的話,很難保證會發生變異。但是,如果樣本數量超過了乙個計算單元的大小,那麼就會導致同步問題。因此在這一點需要折中考慮。同乙個群體的個體可以放到同乙個計算單元中執行,不同的群體放到不同的計算單元上。種群間無需同步。這樣既滿足了樣本的數量需求,也滿足了同步要求。

gpu程式分兩部分,一部分在cpu上執行,這部分程式稱為host program,一部分在gpu上執行,這部分程式稱為kernel 。host 程式負責初始化環境,包括gpu執行環境和引數。kernel則負責計算,並把計算結果寫入記憶體,由host讀取。完整流程如圖2-3:

圖2-3: gpu程式完整執行流程

本章詳細介紹了gpu程式設計模型,包括gpu的硬體框架,介紹硬體相關的背景;程式設計模型介紹軟體的框架;儲存模型講述gpu的記憶體模型,執行模型講述gpu的程式設計框架。此外還有在gpu中程式設計需要注意的一些問題,比如隨機數,同步問題。最後介紹了乙個完整的gpu並行程式的流程。

GPU程式設計例項

gpu是多核技術的代表之一,在一塊晶元上整合多個較低功耗的核心,單個核心頻率基本不變,一般在1 3ghz,設計重心轉向到多核的整合技術,gpu是一種特殊的多核處理器。本文在聯想深騰7000g gpu集群上進行實驗,該集群有100個節點,每個節點包含兩個4核cpu intel xeon 16gb記憶體...

Slim模型部署多GPU

單gpu時,思路很簡單,前向 後向都在乙個gpu上進行,模型引數更新時只涉及乙個gpu。多gpu時,有模型並行和資料並行兩種情況。模型並行指模型的不同部分在不同gpu上執行。資料並行指不同gpu上訓練資料不同,但模型是同乙個 相當於是同乙個模型的副本 tensorflow支援的是資料並行。資料並行的...

GPU程式設計筆記(2)

2009 02 02 19 52 高階渲染語言基礎 1 hlsl語法與c語法非常類似。2 資料型別 bool int 32位signed half 16位float float 32位float double 64位float 3 變數宣告 與c一樣 4 型別修飾 可以使用const,與c 一樣 r...