1. 程式人生 > >異構開發與異構程式設計(CUDA & GPU)

異構開發與異構程式設計(CUDA & GPU)



什麼是異構開發或者程式設計呢?

雖然自己從事CPU+GPU相關工作,但是對異構這個概念之前還不太明確,經過結合開發經驗以及查閱資料,對此概念有了一定的理解。

   一定要注意能夠使用GPU計算的程式必須具有以下特點:需要處理的資料量比較大,資料以陣列或矩陣形式有序儲存,並且對這些資料要進行的處理方式基本相同,各個資料之間的依賴性或者說耦合很小,需要複雜資料結構的計算如樹,圖等,則不適用於使用GPU進行計算。


 學過計算機組成原理的人都會非常熟悉CPU原理及組成,CPU內部結構是由控制單元、運算單元、儲存單元等主要部分組成,其通過地址匯流排與地址匯流排實現資料的操作,此處不再多說了;但當處理大量影象圖形渲染時,CPU效率不能滿足要求(比如大型3D遊戲),於是乎針對複雜圖形影象處理的GPU就出現了;在這裡就不解釋GPU的工作原理了,你可以google 一下!

目前計算單元主要分為:通用計算單元(CPU),專用計算單元(GPU)

下面說說什麼是異構呢?
由一個(或者多個)通用計算單元(CPU)加上一個(或者多個)專用計算單元構建(GPU等)的系統就是異構計算系統,由兩者協同起來共同執行通用計算任務就是異構計算,目前在開發中最常見的組合就是CPU+GPU。對於高要求場合這是明智之舉;

異構計算的目的一般是加速資料的處理能力,過去依靠工藝和頻率來提高CPU的計算效能,但是現在遇到了瓶頸,加速的任務已經由過去依賴工藝和功耗轉向依靠架構的改變。在過去GPU只能執行圖形任務,不能執行通用計算,所以還稱不上異構計算,現在的GPU已經具備了執行通用計算的能力,和CPU協同工作就組成了一個異構計算系統,AMD的APU就是其中的一個實現。

有了硬體的實現,同樣需要軟體的支援,目前比較流行的程式語言是C++AMP/OPENCL/CUDA

以cuda為例介紹如下:

              CUDA(Compute Unified Device Architecture)它中文的名字是統一計算裝置架構,CUDA是一種將GPU作為資料平行計算裝置。

 CUDA 程式設計模型將CPU作為主機(Host),GPU作為協處理器或者裝置(Device),在一個系統中可以存在一個主機和若干個裝置。在這個模型中,CPUCPU協同工作,各司其職。CPU負責進行邏輯性強的事物處理和序列計算,GPU則專注於執行高度執行緒化的並行處理任務。CPUGPU各自擁有相互獨立的儲存器地址空間:主機端的記憶體和裝置端的視訊記憶體。在這個模型中,CPU

CPU協同工作,各司其職。CPU負責進行邏輯性強的事物處理和序列計算,GPU則專注於執行高度執行緒化的並行處理任務。CPUGPU各自擁有相互獨立的儲存器地址空間:主機端的記憶體和裝置端的視訊記憶體。一旦確定了程式的並行部分,就可以考慮把這部分計算工作交給GPU

    找到程式中滿足GPU要求的部分後,就能將該部分程式移植GPU上。執行在GPU上的程式被稱為核心(Kernel)。核心並不是完整的程式,只是整個程式中的一個可以使用資料並行處理的步驟。一個完整的程式由若干個核心函式以及CPU上的序列處理共同組成。一個完整的異構程式設計程式的計算流程如下所示:

                           

如果有理解不當之處,歡迎指正!