GPU 程式設計可以稱為異構程式設計,最近由于機器學習的火熱,很多模型越來越依賴于GPU來進行加速運算,是以異構計算的位置越來越重要;異構程式設計,主要是指CPU+GPU或者CPU+其他裝置(FPGA等)協同計算。目前的計算模型中,CPU主要用來進行通用計算,其更多的是注重控制,我們可以通過GPU和FPGA等做專用的計算。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiETPwJWZ3ZCMwcTP39zZuBnLENTJj1mY3VTaOVTTq1EMBR1T3VEVNRXTE5EMJpWTzUkaOhXR61ENBR1T4FkaNRXRE1EejRkT0gzQPd3aU10dJpHT4FEVNNTUE9kdjJjYzpkMMRXOykVdNNjW2hXbZVnTtxENFRUT5N2ViBXO5xkNNh0YwIFSh9CXt92YuM3YltWas5iclN3Ztl2Lc9CX6MHc0RHaiojIsJye.png)
CPU負責邏輯性強的事物處理和串行計算,GPU則專注于執行高度線程化的并行處理任務(大規模計算任務)
程式設計架構:
- C++ AMP:Accelerator Massive Parallelism :C++的異構并行模型.
- CUDA:Compute Unified Device Architecture :顯示卡廠商Nvidia于2007年推出的業界第一款異構并行程式設計架構。
- OpenCL (Open Computing Language):業界第一個跨平台的異構程式設計架構。它是Apple領銜并聯合Nvidia,AMD,IBM,Intel等衆多廠商于2008年共同推出的一個開放标準,由單獨成立的非營利性組織Khronos Group管理。與C++ AMP類似,OpenCL作為一個開放的标準,并不局限于某個特定的GPU廠商。
三種異構程式設計架構,對比來看:CUDA和OPENCL 比 C++ AMP 更接近于硬體底層,是以前兩者性能較好,C++ AMP 相對前兩者 具有較高的易程式設計性;
三種架構的選擇:
- 看重易用性:C++ AMP, Windows 平台,C++ 本身也是一個開放的标準,目前隻有微軟自己做了實作;
- 看重NvidiaGPU卡上的高性能:CUDA;有大廠的直接支援,CUDA的開發環境也非常成熟,擁有很多函數庫的支援;
- 看重不同平台間的可移植性:OpenCL可能是目前最好的選擇;(相對于OPENCL 你可能會聽說過 OPENCV,OPENGL,OPENAL 等标準)opencl 得到了很多軟硬體廠商的大力支援。
異構計算中常見的組合:
通用處理器對協處理器之間,主要考慮一些幾個方面:協處理器能全面支援需要用到的場景關鍵算法(算法性能);協處理器需要有大量并行通道,每個通道支援低延時的資料處理(資料并行和低延時處理能力);和主處理器能友善得進行資料互動(接口性能較好);協處理器可以針對計算需求更新疊代(配置靈活);協處理器更低的運作成本,更小的空間占用和更簡單的熱處理方案(低功耗);
- CPU+GPU
-
GPU 通用計算;GPU 架構簡析 - GPU 中,大量的硬體資源被用于邏輯運算單元,小部分用作控制電路,GPU中一個控制單元要負責好幾個計算單元,其為大規模資料并行處理提供了基礎;使用GPU做異構計算需要考慮GPU Memory 和 System Memory資料相關性和盡量減少異構計算過程中的控制分支;
-
- CPU+FPGA
- FPGA 優點:
- 穩定性:驅動層控制硬體,減少了系統搶占帶來的風險;
- 性能:利用硬體并行的優勢,打破了順序執行的模式;硬體控制層面控制IO輸入和輸出達到了專業需求能力;
- 維護性高:FPGA可以現場更新,無需重新設計ASIC所需要的時間和費用投入;
- 成本:比定制化的ASIC便宜,可自定義程式設計使用;
- FPGA 優點:
- CPU+ASIC
- ASIC 為Application Specific Integrated Circuit, 特殊定制內建電路。程式設計語言越接近底層硬體,運作速度越快。
- 性能方面:ASIC > FPGA > GPU;
- 缺點:由于ASIC 定制化,導緻價格較為高昂,定制過程漫長,而且功能一旦定制就很難再去更改;
CPU 與 GPU 體系結構:
CPU 是一種低延遲的設計:
- 強大的ALU,擁有較高的時鐘頻率;
- 容量較大的cache,包括L1,L2,L3三級高速緩存,現在基本上是片上cache,cache占據相當一部分片上空間;
- CPU有複雜的控制邏輯,如:複雜的流水線(pipeline)、分支預測(branch prediction)、亂序執行(Out-of-order execution)等;
- 這些導緻了,cpu使用較少的資源用于ALU 計算單元;
GPU是一種面向吞吐的設計:
- GPU 有大量的ALU;
- cache很小,緩存為thread提高服務,而不是儲存後面需要通路的資料,這點和CPU不同;
- 沒有複雜的控制邏輯,沒有分支預測等這些元件;
- 于CPU對比起來,CPU擅長處理邏輯負載,串行的計算任務;而GPU擅長的是大規模的資料并行的計算任務;
參考連結:
http://hustcat.github.io/gpu-architecture/
https://www.huzhenyu.me/
https://www.cnblogs.com/biglucky/p/4223565.html
https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html
http://haifux.org/lectures/267/Introduction-to-GPUs.pdf (推薦)
資源多整理自網絡,保持更新,如果對您有幫助,請關注 cnblogs.com/xuyaowen