cuda簡介- www - Home

文章推薦指數: 80 %
投票人數:10人

CUDA 是NVIDIA 的GPGPU 模型,它使用C 語言為基礎,可以直接以大多數人熟悉的C 語言,寫出在顯示晶片上執行的程式,而不需要去學習特定的顯示晶片的指令或是特殊的結構。

cuda簡介 CUDA簡介 現代的顯示晶片已經具有高度的可程式化能力,由於顯示晶片通常具有相當高的記憶體頻寬,以及大量的執行單元,因此開始有利用顯示晶片來幫助進行一些計算工作的想法,即GPGPU。

CUDA即是NVIDIA的GPGPU模型。

NVIDIA的新一代顯示晶片,包括GeForce8系列及更新的顯示晶片都支援CUDA。

NVIDIA免費提供CUDA的開發工具(包括Windows版本和Linux版本)、程式範例、文件等等,可以在CUDAZone下載。

GPGPU的優缺點使用顯示晶片來進行運算工作,和使用CPU相比,主要有幾個好處:顯示晶片通常具有更大的記憶體頻寬。

例如,NVIDIA的GeForce8800GTX具有超過50GB/s的記憶體頻寬,而目前高階CPU的記憶體頻寬則在10GB/s左右。

顯示晶片具有更大量的執行單元。

例如GeForce8800GTX具有128個"streamprocessors",時脈為1.35GHz。

CPU時脈通常較高,但是執行單元的數目則要少得多。

和高階CPU相比,顯示卡的價格較為低廉。

例如目前一張GeForce8800GT包括512MB記憶體的價格,和一顆2.4GHz四核心CPU的價格相若。

當然,使用顯示晶片也有它的一些缺點:顯示晶片的運算單元數量很多,因此對於不能高度平行化的工作,所能帶來的幫助就不大。

顯示晶片目前通常只支援32bits浮點數,且多半不能完全支援IEEE754規格,有些運算的精確度可能較低。

目前許多顯示晶片並沒有分開的整數運算單元,因此整數運算的效率較差。

顯示晶片通常不具有分支預測等複雜的流程控制單元,因此對於具有高度分支的程式,效率會比較差。

目前GPGPU的程式模型仍不成熟,也還沒有公認的標準。

例如NVIDIA和AMD/ATI就有各自不同的程式模型。

整體來說,顯示晶片的性質類似streamprocessor,適合一次進行大量相同的工作。

CPU則比較有彈性,能同時進行變化較多的工作。

CUDA架構CUDA是NVIDIA的GPGPU模型,它使用C語言為基礎,可以直接以大多數人熟悉的C語言,寫出在顯示晶片上執行的程式,而不需要去學習特定的顯示晶片的指令或是特殊的結構。

在CUDA的架構下,一個程式分為兩個部份:host端和device端。

Host端是指在CPU上執行的部份,而device端則是在顯示晶片上執行的部份。

Device端的程式又稱為"kernel"。

通常host端程式會將資料準備好後,複製到顯示卡的記憶體中,再由顯示晶片執行device端程式,完成後再由host端程式將結果從顯示卡的記憶體中取回。

由於CPU存取顯示記憶體時只能透過PCIExpress介面,因此速度較慢(PCIExpressx16的理論頻寬是雙向各4GB/s),因此不能太常進行這類動作,以免降低效率。

在CUDA架構下,顯示晶片執行時的最小單位是thread。

數個thread可以組成一個block。

一個block中的thread能存取同一塊共用的記憶體,而且可以快速進行同步的動作。

每一個block所能包含的thread數目是有限的。

不過,執行相同程式的block,可以組成grid。

不同block中的thread無法存取同一個共用的記憶體,因此無法直接互通或進行同步。

因此,不同block中的thread能合作的程度是比較低的。

不過,利用這個模式,可以讓程式不用擔心顯示晶片實際上能同時執行的thread數目限制。

例如,一個具有很少量執行單元的顯示晶片,可能會把各個block中的thread循序執行,而非同時執行。

不同的grid則可以執行不同的程式(即kernel)。

Grid、block和thread的關係,如下圖所示:每個thread都有自己的一份register和localmemory的空間。

同一個block中的每個thread則有共用的一份sharememory。

此外,所有的thread(包括不同block的thread)都共用一份globalmemory、constantmemory、和texturememory。

不同的grid則有各自的globalmemory、constantmemory和texturememory。

這些不同的記憶體的差別,會在之後討論。

執行模式由於顯示晶片大量平行計算的特性,它處理一些問題的方式,和一般CPU是不同的。

主要的特點包括:記憶體存取latency的問題:CPU通常使用cache來減少存取主記憶體的次數,以避免記憶體latency影響到執行效率。

顯示晶片則多半沒有cache(或很小),而利用平行化執行的方式來隱藏記憶體的latency(即,當第一個thread需要等待記憶體讀取結果時,則開始執行第二個thread,依此類推)。

分支指令的問題:CPU通常利用分支預測等方式來減少分支指令造成的pipelinebubble。

顯示晶片則多半使用類似處理記憶體latency的方式。

不過,通常顯示晶片處理分支的效率會比較差。

因此,最適合利用CUDA處理的問題,是可以大量平行化的問題,才能有效隱藏記憶體的latency,並有效利用顯示晶片上的大量執行單元。

使用CUDA時,同時有上千個thread在執行是很正常的。

因此,如果不能大量平行化的問題,使用CUDA就沒辦法達到最好的效率了。

Home CUDA簡介 安裝CUDA第一個CUDA程式改良第一個程式第二個CUDA程式GPU的硬體架構Copyright(c)2007Ping-CheChen  Signin|RecentSiteActivity|ReportAbuse|PrintPage|PoweredByGoogleSites



請為這篇文章評分?