CUDA:一種在GPU上進行計算的新架構
它是我們迫切需要的新穎的硬件和編程模型,能讓GPU的計算能力得以完全發(fā)揮,并將GPU暴露為一種真正通用的數(shù)據(jù)并行計算設備。
CUDA表示Compute Unified Device Architecture(統(tǒng)一計算設備架構),是NVIDIA為自家的GPU編寫了一套編譯器及相關的庫文件。作為一種新型的硬件和軟件架構,用于將GPU上作為數(shù)據(jù)并行計算設備在GPU上進行計算的發(fā)放和管理,而無需將其映射到圖像API。
CUDA提供了硬件的直接訪問接口,不必依賴圖形API |
CUDA可用于GeForce 8系列、Tesla解決方案和一些Quadro解決方案,操作系統(tǒng)的多任務機制負責管理多個并發(fā)運行的CUDA和圖像應用程序?qū)PU的訪問。
CUDA采用C語言作為編程語言提供大量的高性能計算指令開發(fā)能力,使開發(fā)者能夠在GPU的強大計算能力的基礎上建立起一種效率更高的密集數(shù)據(jù)計算解決方案。CUDA是業(yè)界的首款并行運算語言,而且其非常普及化,目前有高達8千萬的PC用戶可以支持該語言。
CUDA的特色如下,引自NVIDIA的官方說明:
1、為并行計算設計的統(tǒng)一硬件軟件架構。有可能在G80系列上得到發(fā)揮。
2、在GPU內(nèi)部實現(xiàn)數(shù)據(jù)緩存和多線程管理。這個強,思路有些類似于XB360 PS3上的CPU編程。
3、在GPU上可以使用標準C語言進行編寫。
4、標準離散FFT庫和BLAS基本線性代數(shù)計算庫。
5、一套CUDA計算驅(qū)動。
6、提供從CPU到GPU的加速數(shù)據(jù)上傳性能。瓶頸就在于此。
7、CUDA驅(qū)動可以和OpenGL DirectX驅(qū)動交互操作。這強,估計也可以直接操作渲染管線。
8、與SLI配合實現(xiàn)多硬件核心并行計算。
9、同時支持Linux和Windows。
◆ CUDA:主導GPU計算的革命
GPU超強的計算能力讓它在通用計算領域大有可為,而CUDA則讓它變成可能,簡單易用的開發(fā)環(huán)境讓CUDA主導起GPU計算的革命。
正如NVIDIA首席科學家David Kirk所說:“我認為CUDA已經(jīng)取得了空前成功,它的接受程度令人吃驚。這也表明了人們希望對整臺電腦進行編程的濃厚興趣。過去人們往往是編寫一個C程序來控制CPU,再編寫一個圖形程序來控制GPU。你一定想通過編寫一個程序來控制CPU和GPU。因此我堅信,將來CUDA將變得無處不在。如果要對CPU和GPU進行編程并管理系統(tǒng)中的所有資源,那就沒有理由不用CUDA。”
GPU正逐漸將并行計算推向主流,并行計算與異構處理器系統(tǒng)的“聯(lián)姻”將是大勢所趨。而主導這場變革的就是CUDA。隨著越來越多的開發(fā)者加入到CUDA懷抱,支持CUDA的軟件必將滲透到我們生活的方方面面,億萬次的計算能力是我們充滿期待最好的詮釋。
◆ CUDA的本質(zhì)
CUDA的本質(zhì)是,NVIDIA為自家的GPU編寫了一套編譯器NVCC極其相關的庫文件。CUDA的應用程序擴展名可以選擇是.cu,而不是.cpp等。
NVCC是一個預處理器和編譯器的混合體。當遇到CUDA代碼的時候,自動編譯為GPU執(zhí)行的代碼,也就是生成調(diào)用CUDA Driver的代碼。如果碰到Host C++代碼,則調(diào)用平臺自己的C++編譯器進行編譯,比如Visual Studio C++自己的Microsoft C++ Compiler。然后調(diào)用Linker把編譯好的模塊組合在一起,和CUDA庫與標準CC++庫鏈接成為最終的CUDA Application。由此可見,NVCC模仿了類似于GCC一樣的通用編譯器的工作原理(GCC編譯CC++代碼本質(zhì)上就是調(diào)用cc和g++)。
CUDA在執(zhí)行的時候是讓host里面的一個一個的kernel按照線程網(wǎng)格(Grid)的概念在顯卡硬件(GPU)上執(zhí)行。每一個線程網(wǎng)格又可以包含多個線程塊(block),每一個線程塊中又可以包含多個線程(thread)。
以軍隊來打比方,每一個線程,就相當于每一個士兵,當要執(zhí)行某一個大的軍事任務的時候,大將軍(Host)發(fā)布命令,把這次行動分解成一個一個的子任務(kernel_1,kernel_2……kernel_M),每個子任務由不同的統(tǒng)領(Grid)負責,各統(tǒng)領又把任務分成一部分一部分,劃分給手下的小頭目(Block),這些任務就由小頭目下的士兵(Thread)去執(zhí)行完成。 #p#page_title#e#
通過CUDA編程時,將GPU看作可以并行執(zhí)行非常多個線程的計算設備(compute device)。它作為主CPU的協(xié)處理器或者主機(host)來運作:換句話說,在主機上運行的應用程序中數(shù)據(jù)并行的、計算密集的部分卸載到此設備上。
經(jīng)過了CUDA對線程、線程塊的定義和管理,在支持CUDA的GPU內(nèi)部實際上已經(jīng)成為了一個迷你網(wǎng)格計算系統(tǒng)。在內(nèi)存訪問方面,整個GPU可以支配的存儲空間被分成了寄存器(Register)、全局內(nèi)存(External DRAM)、共享內(nèi)存(Parallel Data Cache)三大部分。其中寄存器和共享內(nèi)存集成在GPU內(nèi)部,擁有極高的速度,但容量很小。共享內(nèi)存可以被同個線程塊內(nèi)的線程所共享,而全局內(nèi)存則是我們熟知的顯存,它在GPU外部,容量很大但速度較慢。經(jīng)過多個級別的內(nèi)存訪問結(jié)構設計,CUDA已經(jīng)可以提供讓人滿意的內(nèi)存訪問機制,而不是像傳統(tǒng)GPGPU那樣需要開發(fā)者自行定義。
在CUDA的幫助下普通程序員只要學習一點點額外的GPU架構知識,就能立刻用熟悉的C語言釋放GPU恐怖的浮點運算能力,通過CUDA所能調(diào)度的運算力已經(jīng)非常逼近萬億次浮點運算(GeForce 280GTX單卡浮點運算能力為933GF LOPS)。而在此之前要獲得萬億次的計算能力至少需要購買價值幾十萬元的小型機。
CUDA支持的GPU (CUDA-enabled GPU)包含GeForce、Quadro和Tesla三個系列:GeForce是NVIDIA公司面向消費市場的GPU產(chǎn)品;Quadro是面向?qū)I(yè)圖形市場的GPU產(chǎn)品;而Tesla則是專門面向GPU計算的產(chǎn)品,它不具備圖形輸出的功能,因此不能作為圖形卡來使用。這三個產(chǎn)品面向不同的應用領域,因此建議在開發(fā)和部署CUDA應用的時候需要考慮到產(chǎn)品的應用決定采用不同的GPU。
NVIDIA的CUDA-enabled GPU具有一個完整的產(chǎn)品線,各種用戶都可以從中選擇到合適自己的產(chǎn)品。對于有高密度計算能力需求的用戶來說,Quadro和Tesla則是必須的選擇。諸如Quadro Plex 1000 Model S4和Tesla S870在一個1U高度的標準服務器機架機箱內(nèi)裝備了四個GPU,每個GPU具備128個stream processor以及1.5GB的存儲器,每個1U裝置總共具備512個stream processor和6GB存儲器,非常適合于有高密度、大規(guī)模數(shù)據(jù)計算需求的用戶