以下內容來自網路總結:

NVIDIA公司在1999年發布GeForce256時首先提出GPU(圖形處理器)的概念,隨後大量複雜的應用需求促使整個產業蓬勃發展至今。

GPU英文全稱Graphic Processing Unit,中文翻譯為」圖形處理器」。GPU從誕生之日起就以超越摩爾定律的速度發展,運算能力不斷提升。業界很大研究者注意到GPU進行計算的潛力,於2003年SIGGRAPH大會上提出了GPGPU(General-purposecomputing on graphics units)的概念。GPU逐漸從由若干專用的固定功能單元(Fixed Function Unit)組成的專用並行處理器向以通用計算資源為主,固定功能單元為輔的架構轉變。

儘管GPU計算已經開始嶄露頭角,但GPU並不能完全替代X86解決方案,很多操作系統、軟體以及部分代碼現在還不能運行在GPU上,所謂的GPU+CPU異構超級計算機也並不是完全基於GPU進行計算。一般而言適合GPU運算的應用有如下特徵:運算密集、高度並行、控制簡單、分多個階段執行,符合這些條件或者是可以改寫成類似特徵的應用程序,就能夠在GPU上獲取較高的性能。

GPU是顯示卡的「心臟、大腦」,也就相當於CPU在電腦中的作用,它決定了該顯卡的檔次和大部分性能,同時也是2D顯示卡和3D顯示卡的區別依據。2D顯示晶元在處理3D圖像和特效時主要依賴CPU的處理能力,稱為「軟加速」。3D顯示晶元是將三維圖像和特效處理功能集中在顯示晶元內,也即所謂的「硬體加速」功能。顯示晶元通常是顯示卡上最大的晶元(也是引腳最多的)。現在市場上的顯卡大多採用NVIDIA(英偉達)和AMD兩家公司的圖形處理晶元。

GPU通用計算編程模型:

GPU通用計算通常採用CPU+GPU異構模式,由CPU負責執行複雜邏輯處理和事務處理等不適合數據並行的計算,由GPU負責計算密集型的大規模數據並行計算。這種利用GPU強大處理能力和高帶寬彌補CPU性能不足的計算方式以發揮計算機潛在性能,在成本和性價比方面有顯著地優勢。在2007年NIVDIA推出CUDA(Compute Unified DeviceArchitecture,統一計算設備架構)之前,GPU通用計算受硬體可編程性和開發方式的制約,開發難度較大。2007年以後,CUDA不斷發展的同時,其他的GPU通用計算標準也被相繼提出,如由Apple提出Khronos Group最終發布的OpenCL,AMD推出的Stream SDK,Microsoft則在其最新的Windows7系統中集成了DirectCompute以支持利用GPU進行通用計算。

CUDA是一種將GPU作為數據並行計算設備的軟硬體體系,硬體上NVIDIA GeForce8系列以後的GPU(包括GeForce、ION、Quadro、Tesla系列)已經採用支持CUDA的架構,軟體開發包上CUDA也已經發展到CUDA Toolkit3.2(截止到2010年11月),並且支持Widows、Linux、MacOS三種主流操作系統。CUDA採用比較容易掌握的類C語言進行開發,而且正在開發適用於CUDA架構的用於科學計算的Fortran版本。無論是CUDA C-語言或是OpenCL,指令最終都會被驅動程序轉換成PTX(Parallel ThreadExecution,並行線程執行,CUDA架構中的指令集,類似於彙編語言)代碼,交由顯示核心計算。

CUDA編程模型將CPU作為主機(Host),GPU作為協處理器(co-processor)或者設備(Device)。在一個系統中可以存在一個主機和若干個設備。CPU、GPU各自擁有相互獨立的存儲地址空間:主機端內存和設備端顯存。CUDA對內存的操作與一般的C程序基本相同,但是增加了一種新的pinned memory;操作顯存則需要調用CUDA API存儲器管理函數。一旦確定了程序中的並行部分,就可以考慮把這部分計算工作交給GPU。運行在GPU上的CUDA並行計算函數稱為kernel(內核函數)。一個完整的CUDA程序是由一系列的設備端kernel函數並行步驟和主機端的串列處理步驟共同組成的。這些處理步驟會按照程序中相應語句的順序依次執行,滿足順序一致性。

CUDA SDK提供的API分為CUDA runtime API(運行時API)和CUDA driver API(驅動程序API)。CUDA runtime API在CUDA driver API的基礎上進行了封裝,隱藏了一些實現細節,編程更加方便。CUDA runtime API函數前都有CUDA前綴。CUDA driver API是一種基於句柄的底層介面,可以載入二進位或彙編形式的kernel模塊,指定參數並啟動運算。CUDA driver API編程複雜,但有時能通過直接操作硬體的執行實現一些更加複雜的功能或者獲得更高的性能。由於它使用的設備端代碼是二進位或者彙編代碼,因此可以在各種語言中調用。CUDA driver API所有函數的前綴為cu。另外CUDA SDK也提供了CUFFT(CUDA Fast Fourier Transform,基於CUDA的快速傅立葉變換)、CUBLAS(CUDA Basic Linear Algebra Subprograms,基於CUDA的基本矩陣與向量運算庫)和CUDPP(CUDA Data Parallel Primitives,基於CUDA的常用並行操作函數)等函數庫,提供了簡單高效的常用函數供開發者直接使用。

從CUDA Toolkit3.0開始支持NVIDIA最新的Fermi架構,最大程度上利用Fermi架構在通用計算方面的優勢。CUDA 3.0也開始支持C++的繼承和模板機制提高編程靈活性,同時CUDA C/C++內核現在以標準ELF格式進行編譯,開始支持硬體調試,還增加了一個新的Direct3D、OpenGL統一協作API,支持OpenGL紋理和Direct3D 11標準,支持所有的OpenCL特徵。

NVIDIA宣布最新版並行計算開發工具CUDA 6,相比此前的CUDA5.5有著革命性的巨大進步。CUDA 6的關鍵特性包括:同一定址,可直接訪問CPU內存、GPU顯存,無需在彼此之間手動拷貝數據,可在大量編程語言中更簡單地添加GPU加速支持。

OpenCL(OpenComputingLanguage,開放計算語言)是一個為異構平台編寫程序的框架,此異構平台可由CPU、GPU或其他類型的處理器組成。OpenCL由用於編寫kernels(在OpenCL設備上運行的函數)的語言(基於C99)和一組用於定義並控制平台的API組成。OpenCL提供了基於任務分區和數據分區的並行計算機制。

OpenCL最初由Apple公司開發,Apple擁有其商標權,並在與AMD,IBM,Intel和NVIDIA技術團隊的合作之下初步完善。隨後,Apple將這一草案提交至Khronos Group。2008年6月16日,Khronos的通用計算工作小組成立。5個月後的2008年11月18日,該工作組完成了OpenCL 1.0規範的技術細節。該技術規範在由Khronos成員進行審查之後,於2008年12月8日公開發表。2010年6月14日,OpenCL1.1發布。

OpenCL也是基於C的一個程式語言,分為Platform Layer、Runtime、Compiler三個部分:Platform Layer用來管理計算裝置,提供初始化裝置的界面,並用來建立compute contexts和work-queues。Runtime用來管理資源,並執行程序的kernel。Compiler則是ISO C99的子集合,並加上了OpenCL特殊的語法。在OpenCL的執行模型中,有所謂的Compute Kernel和Compute Program。Compute Kernel基本上類似於CUDA定義的kernel,是最基本的計算單元;而Compute Program則是Compute Kernel和內建函數的集合,類似一個動態函數庫。很大程度上OpenCL與CUDA Driver API比較相像。

自從2008年12月NVIDIA在SIGGRAPHAsia大會上在筆記本電腦上展示全球首款OpenCL GPU演示以來,AMD、NVIDIA、Apple、RapidMind、Gallium3D、ZiiLABS、IBM、Intel先後發布他們自己的OpenCL規範實現(當一台機器上存在不同廠家的支持OpenCL的設備時,這樣也給開發應用程序帶來不統一的一些麻煩)。除了AMD和NVIDIA,其他廠商如S3、VIA等也紛紛發布他們支持OpenCL的硬體產品。

OpenCL是第一個面向異構系統通用目的並行編程的開放式、免費標準,也是一個統一的編程環境,便於軟體開發人員為高性能計算伺服器、桌面計算系統、手持設備編寫高效輕便的代碼,而且廣泛適用於多核心處理器(CPU)、圖形處理器(GPU)、Cell類型架構以及數字信號處理器(DSP)等其他並行處理器,在遊戲、娛樂、科研、醫療等各種領域都有廣闊的發展前景,AMD-ATI、NVIDIA現在的產品都支持OPEN CL。

Directcompute是一種由Microsoft開發和推廣的用於GPU通用計算的應用程序介面,集成在Microsoft DirectX內,允許Windows Vista或Windows 7平台上運行的程序利用GPU進行通用計算。雖然DirectCompute最初在DirectX 11 API中得以實現,但支持DX10的GPU可以利用此API的一個子集進行通用計算(DirectX 10內集成Directcompute 4.0,DirectX 10.1內集成Directcompute 4.1),支持DirectX11的GPU則可以使用完整的DirectCompute功能(DirectX 11內集成Directcompute 5.0)。Directcompute和OpenCL都是開放標準,得到NVIDIA CUDA架構和ATI Stream技術的支持。

Windows 7增加了視頻即時拖放轉換功能,可以將電腦中的視頻直接轉換到移動媒體播放器上,如果電腦中的GPU支持Directcompute,那麼這一轉換過程就將由GPU完成。其轉換速度將達到CPU的5-6倍。Internet Explorer 9加入了對Directcompute技術的支持,可以調用GPU對網頁中的大計算量元素做加速計算,另外Excel2010、Powerpoint2010均提供Directcompute技術支持。

AMD的流計算模型其實也包含了流處理器架構和相應的軟體包。AMD在2007年12月發布運行在Windows XP系統下的Steam SDK v1.0,此SDK採用了Brook+作為開發語言,Brook+是AMD對斯坦福大學開發的Brook語言(基於ANSI C)的改進版本。Stream SDK為開發者提供對系統和平台開放的標準以方便合作者開發第三方工具。軟體包包含了如下組件:支持Brook+的編譯器,支持流處理器的設備驅動CAL(Compute Abstraction Layer),程序庫ACML(AMD CoreMath Library)以及內核函數分析器。

在Stream編程模型中,在流處理器上執行的程序稱為kernel(內核函數),每個運行在SIMD引擎的流處理器上的kernel實例稱為thread(線程),線程映射到物理上的運行區域稱為執行域。流處理器調度線程陣列到線程處理器上執行,直到所有線程完成後才能運行下一個內核函數。

Brook+是流計算的上層語言,抽象了硬體細節,開發者編寫能夠運行在流處理器上的內核函數,只需指定輸入輸出和執行域,無需知道流處理器硬體的實現。Brook+語言中兩個關鍵特性是:Stream和Kernel。Stream是能夠並行執行的相同類型元素的集合;Kernel是能夠在執行域上並行執行的函數。Brook+軟體包包含brcc和brt。brcc是一個源語言對源語言的編譯器,能夠將Brook+程序翻譯成設備相關的IL(IntermediateLanguage),這些代碼被後續鏈接、執行。brt是一個可以執行內核函數的運行時庫,這些庫函數有些運行在CPU上,有些運行在流處理器上。運行在流處理器上的核函數庫又稱為CAL(Compute Abstraction Layer)。CAL是一個用C編寫的設備驅動庫,允許開發者在保證前端一致性的同時對流處理器核心從底層進行優化。CAL提供了設備管理、資源管理、內核載入和執行、多設備支持、與3D圖形API交互等功能。同時,Stream SDK也提供了常用數學函數庫ACML(AMD Core Math Library)供開發者快速獲得高性能的計算。ACML包括基本完整的線性代數子常式、FFT運算常式、隨機數產生常式和超越函數常式。

面對NVIDIA在GPU通用計算上的不斷創新,AMD也不甘示弱,不斷改進自己的Stream SDK。截止到2010年11月,AMD發布了Stream SDK v2.2,能夠在WindowsXP SP3、Windows 7和部分Linux發行版上運行,開始支持OpenCL 1.1規範和雙精度浮點數操作。

參考文獻:

1、 http://baike.baidu.com/view/1196.htm

2、 http://www.cnblogs.com/chunshan/archive/2011/07/18/2110076.html

3、 http://blog.csdn.net/caiye917015406/article/details/9166115

4、 http://www.rosoo.net/a/201306/16652.html


推薦閱讀:
查看原文 >>
相关文章