CUDA基礎介紹
一、GPU簡介
1985年8月20日ATi公司成立,同年10月ATi使用ASIC技術開發出了第一款圖形芯片和圖形卡,1992年4月ATi發布了Mach32圖形卡集成了圖形加速功能,1998年4月ATi被IDC評選為圖形芯片工業的市場領導者,但那時候這種芯片還沒有GPU的稱號,很長的一段時間ATi都是把圖形處理器稱為VPU,直到AMD收購ATi之後其圖形芯片才正式采用GPU的名字。
NVIDIA公司在1999年發布GeForce 256圖形處理芯片時首先提出GPU的概念。GPU使顯卡削減了對CPU的依賴,並實現部分原本CPU的工作,尤其是在3D圖形處理時。GPU所采用的核心技術有硬體T&L(Transform and Lighting,多邊形轉換和光源處理)、立方環境材質貼圖與頂點混合、紋理壓縮及凹凸映射貼圖、雙重紋理四像素256位渲染引擎等,而硬體T&L技術能夠說是GPU的標誌。
GPU(Graphics Processing Unit)即圖形處理器,又稱顯示核心、視覺處理器、顯示芯片,是一種專門在個人電腦、工作站、遊戲機和一些移動設備(如平板電腦、智能手機等)上作圖像運算工作的微處理器。
顯卡作為電腦主機裏的一個重要組成部分,承擔輸出顯示圖形的任務。顯卡的處理器稱為圖形處理器(GPU),它是顯卡的”心臟”,與CPU類似,只不過GPU是專為執行復雜的數學和幾何計算而設計的,這些計算是圖形渲染所必需的。
時下的GPU多數擁有2D或3D圖形加速功能。有了GPU,CPU就從圖形處理的任務中解放出來,可以執行其他更多的系統任務,這樣可以大大提高計算機的整體性能。
GPU會產生大量熱量,所以它的上方通常安裝有散熱器或風扇。
GPU是顯示卡的”大腦”,GPU決定了該顯卡的檔次和大部分性能,同時GPU也是2D顯示卡和3D顯示卡的區別依據。2D顯示芯片在處理3D圖像與特效時主要依賴CPU的處理能力,稱為軟加速。3D顯示芯片是把三維圖像和特效處理功能集中在顯示芯片內,也就是所謂的”硬件加速”功能。顯示芯片一般是顯示卡上最大的芯片(也是引腳最多的)。時下市場上的顯卡大多采用NVIDIA和 AMD-ATI 兩家公司的圖形處理芯片。
GPU已經不再局限於3D圖形處理了,GPU通用計算技術發展已經引起業界不少的關註,在浮點運算、並行計算等部分計算方面,GPU可以提供數十倍乃至於上百倍於CPU的性能。
GPU通用計算方面的標準目前有OpenCL、CUDA、AMD APP、DirectCompute。
二、GPU通用計算編程
對GPU通用計算進行深入研究從2003年開始,並提出了GPGPU概念,前一個GP則表示通用目的(General Purpose),所以GPGPU一般也被稱為通用圖形處理器或通用GPU。
GPU通用計算通常采用CPU+GPU異構模式,由CPU負責執行復雜邏輯處理和事務處理等不適合數據並行的計算,由GPU負責計算密集型的大規模數據並行計算。
OpenCL(Open Computing Language,開放運算語言)是第一個面向異構系統通用目的並行編程的開放式、免費標準,也是一個統一的編程環境,便於軟件開發人員為高性能計算服務器、桌面計算系統、手持設備編寫高效輕便的代碼,而且廣泛適用於多核心處理器(CPU)、圖形處理器(GPU)、Cell類型架構以及數字信號處理器(DSP)等其他並行處理器,AMD-ATI、NVIDIA時下的產品都支持OpenCL。目前,OpenCL最新版本為2.2.
CUDA(Compute Unified Device Architecture)是一種將GPU作為數據並行計算設備的軟硬件體系,硬件上NVIDIA GeForce 8系列以後的GPU(包括GeForce、ION、Quadro、Tesla系列)已經采用支持CUDA的架構,軟件開發包上CUDA也已經發展到CUDA Toolkit 8.0,並且支持Windows、Linux、MacOS三種主流操作系統。CUDA采用比較容易掌握的類C語言進行開發。
AMD APP(AMD Accelerated Parallel Processing)是AMD加速並行處理技術。是AMD針對旗下圖形處理器(GPU)所推出的通用並行計算技術。利用這種技術可以充分發揮AMD GPU的並行運算能力,用於對軟件進行加速運算或進行大型的科學運算。AMD APP技術的前身稱作ATI Stream。2010年10月,隨著AMD Radeon HD6800系列顯卡的發布,ATI品牌正式被AMD取代。ATI Stream技術也隨著技術升級並更名為AMD APP技術。目前,AMD APP SDK最新版本為3.0.
DirectCompute是一種用於GPU通用計算的應用程序接口,由Microsoft(微軟)開發和推廣,集成在Microsoft DirectX內。目前,最新的DirectX版本為DirectX 12,安裝在windows 10上。DirectX 11內集成DirectCompute 5.0,那DirectX 12內應該是集成DirectCompute 6.0吧。
其中OpenCL、DirectCompute、AMD APP(基於開放型標準OpenCL開發)是開放標準,CUDA是私有標準。
三、NVIDIA 顯卡系列
NVIDIA(英偉達)創立於1993年1月,是一家以設計智核芯片組為主的無晶圓(Fabless)IC半導體公司。
NVIDIA已經開發出了五大產品系列,以滿足特定細分市場需求,包括:GeForce、Tegra、ION、Quadro、Tesla。
Geforce系列主要面向家庭和企業的娛樂應用,該系列又可以分為面向性能的GTX系列,面向主流市場的GTS和GT系列,已經具有高性價比的GS系列。
Quadro系列主要應用於圖形工作站中,對專業領域應用進行了專門優化。
Tesla系列是專門用於高性能通用計算的產品線。
Tegra系列是NVIDIA為便攜式和移動領域推出的全新解決方案,在極為有限的面積上集成了通用處理器、GPU、視頻解碼、網絡、音頻輸入輸出等功能,並維持了極低的功耗。
針對Geforce顯卡系列,NVIDIA各代顯卡都遵循了由高至低命名規則:GTX>GTS>GT>GS
從GTX 500系開始,為避免命名復雜帶來的產品線識別困擾,NVIDIA顯卡將取消GTS級別的顯卡,中高端全部使用GTX命名,而低端使用GT命名,帶Ti後綴為更高一級顯卡,如GTX 560 Ti > GTX 560.
NVIDIA顯卡末尾數字解讀,以GeForce GTX 980M:GTX代表是高端顯卡的意思;980M:第一位數字9,代表第幾代的意思(9是高端顯卡第九代的意思,如果末尾數字有四位,則前兩位表示是第多少代的意思,如GeForce GTX 1080)。第二位至關重要,因為顯卡分高端顯卡,中端顯卡,入門級顯卡就是取決於第二位數字的。第二位數字是1-2代表是入門級顯卡;第二位數字是3-5代表是中端顯卡;第二位數字是6-9代表是高端顯卡。第三位數字是一個特殊的標誌,幾乎能在市場上買到的顯卡都是0結尾的,如果第三位數字為5的顯卡一般都是OEM顯卡,即只給大廠子做品牌機的特供。數字越大,性能越好。顯卡數字後綴Ti,代表加強。
如果用顯卡來進行各種運算,衡量顯卡性能的參數可包括:(1)、核心數目;(2)、顯存帶寬(GPU計算能力太強,很多時候瓶頸都在數據傳輸上);(3)、峰值單精度浮點計算能力;(4)、峰值雙精度浮點計算能力;(5)、時鐘頻率;(6)、架構版本。
四、CUDA基礎
1. 簡介
CUDA(Compute Unified Device Architecture,統一計算設備架構),是顯卡廠商NVIDIA在2007年推出的並行計算平臺和編程模型。它利用圖形處理器(GPU)能力,實現計算性能的顯著提高。CUDA是一種由NVIDIA推出的通用並行計算架構,該架構使GPU能夠解決復雜的計算問題,從而能通過程序控制底層的硬件進行計算。它包含了CUDA指令集架構(ISA)以及GPU內部的並行計算引擎。開發人員可以使用C/C++/C++11語言來為CUDA架構編寫程序。CUDA提供host-device的編程模式以及非常多的接口函數和科學計算庫,通過同時執行大量的線程而達到並行的目的。
3.0以下版本僅支持C編程,從3.0版本開始支持C++編程,從7.0版本開始支持C++11編程。
CUDA僅能在有NVIDIA顯卡的設備上才能執行,並不是所有的NVIDIA顯卡都支持CUDA,目前NVIDIA的GeForce、ION、Quadro以及Tesla顯卡系列上均可支持。根據顯卡本身的性能不同,支持CUDA的版本也不同。
2. 安裝
(1)、在windows上的安裝可以參考:http://blog.csdn.net/fengbingchun/article/details/53892997
(2)、在ubuntu上的安裝可以參考:http://blog.csdn.net/fengbingchun/article/details/53840684
3. 使用CUDA C編寫代碼的前提條件
(1)、支持CUDA的圖形處理器:從2007年開始,NVIDIA新推出的並且顯存超過256MB的GPU都可以用於開發和運行基於CUDAC編寫的代碼。
(2)、NVIDIA設備驅動程序:NVIDIA提供了一些系統軟件來實現應用程序與支持CUDA的硬件之間的通信,即顯卡驅動程序。要確保安裝匹配的驅動程序,選擇與開發環境相符的圖形卡和操作系統。
(3)、CUDA開發工具箱:CUDA Toolkit,註意選擇與操作系統相匹配的CUDA Toolkit。
(4)、標準C編譯器:由於CUDA C應用程序將在兩個不同的處理器上執行計算,因此需要兩個編譯器。其中一個編譯器為GPU編譯代碼,而另一個為CPU編譯代碼。下載並安裝CUDA Toolkit後,就會獲得一個編譯GPU代碼的編譯器。對於CPU編譯器,Windows推薦使用Visual Studio,Linux使用GNU C編譯器(gcc),Mac使用Xcode。
4. 設備計算能力
設備計算能力的版本描述了一種GPU對CUDA功能的支持程度。計算能力版本中小數點前的第一位用於表示設備核心架構,小數點後的第一位則表示更加細微的進步,包括對核心架構的改進以及功能的完善等。例如,計算能力1.0的設備能夠支持CUDA,而計算能力1.1設備加入了對全局存儲器原子操作的支持,計算能力1.2的設備則可以支持warp vote函數等更多功能,而計算能力1.3的設備又加入了對雙精度浮點運算功能。
GeForce GTX 970型號計算能力為5.2,GeForce GT 640M型號計算能力為3.0,目前GeForce系列最高的計算能為6.1,可在https://developer.nvidia.com/cuda-gpus中查找各種系列型號的計算能力以及查找指定的顯卡型號是否支持CUDA。
5. 軟件體系
CUDA的軟件堆棧由三層構成,如下圖,CUDA Library、CUDA runtimeAPI、CUDA driver API. CUDA的核心是CUDA C語言,它包含對C語言的最小擴展集和一個運行時庫,使用這些擴展和運行時庫的源文件必須通過nvcc編譯器進行編譯。
CUDA C語言編譯得到的只是GPU端代碼,而要管理GPU資源,在GPU上分配顯存並啟動內核函數,就必須借助CUDA運行時API(runtime API)或者CUDA驅動API(driver API)來實現。在一個程序中只能使用CUDA運行時API與CUDA驅動API中的一種,不能混合使用。
CUDA基礎介紹