CUDA編程指南詳細(xì)的介紹了如何在CUDA編程實(shí)現(xiàn)最大限度的利用N顯卡資源來實(shí)現(xiàn)加速的功能。
該作品是PDF文件格式請(qǐng)下載 福昕PDF閱讀器
CUDA優(yōu)點(diǎn)
在GPUs(GPGPU)上使用圖形APIs進(jìn)行傳統(tǒng)通用計(jì)算,CUDA技術(shù)有下列幾個(gè)優(yōu)點(diǎn):
分散讀取——代碼可以從存儲(chǔ)器的任意地址讀取
統(tǒng)一虛擬內(nèi)存(CUDA 6)
共用存儲(chǔ)器——CUDA公開一個(gè)快速的共用存儲(chǔ)區(qū)域(每個(gè)處理器48K),使之在多個(gè)進(jìn)程之間共用。其作為一個(gè)用戶管理的高速緩存,比使用紋理查找可以得到更大的有效帶寬。
與GPU之間更快的下載與回讀
全面支持整型與位操作,包括整型紋理查找
限制:
CUDA不支持完整的C語言標(biāo)準(zhǔn)。它在C++編譯器上運(yùn)行主機(jī)代碼時(shí),會(huì)使一些在C中合法(但在C++中不合法)的代碼無法編譯。
不支持紋理渲染(CUDA 3.2及以后版本通過在CUDA數(shù)組中引入“表面寫操作”——底層的不透明數(shù)據(jù)結(jié)構(gòu)——來進(jìn)行處理)
受系統(tǒng)主線的帶寬和延遲的影響,主機(jī)與設(shè)備存儲(chǔ)器之間數(shù)據(jù)復(fù)制可能會(huì)導(dǎo)致性能下降(通過過GPU的DMA引擎處理,異步存儲(chǔ)器傳輸可在一定范圍內(nèi)緩解此現(xiàn)象)
當(dāng)線程總數(shù)為數(shù)千時(shí),線程應(yīng)按至少32個(gè)一組來運(yùn)行才能獲得最佳效果。如果每組中的32個(gè)進(jìn)程使用相同的運(yùn)行路徑,則程序分支不會(huì)顯著影響效果;在處理本質(zhì)上不同的任務(wù)時(shí),SIMD運(yùn)行模型將成為一個(gè)瓶頸(如在光線追蹤算法中遍歷一個(gè)空間分區(qū)的數(shù)據(jù)結(jié)構(gòu))
與OpenCL不同,只有Nvidia的GPUs支持CUDA技術(shù)
由于編譯器需要使用優(yōu)化技術(shù)來利用有限的資源,即使合法的C/C++有時(shí)候也會(huì)被標(biāo)記并中止編譯
CUDA(計(jì)算能力1.x)使用一個(gè)不包含遞歸、函數(shù)指針的C語言子集,外加一些簡(jiǎn)單的擴(kuò)展。而單個(gè)進(jìn)程必須運(yùn)行在多個(gè)不相交的存儲(chǔ)器空間上,這與其它C語言運(yùn)行環(huán)境不同。
CUDA(計(jì)算能力2.x)允許C++類功能的子集,如成員函數(shù)可以不是虛擬的(這個(gè)限制將在以后的某個(gè)版本中卸載)[參見《CUDA C程序設(shè)計(jì)指南3.1》-附錄D.6]
雙精度浮點(diǎn)(CUDA計(jì)算能力1.3及以上)與IEEE754標(biāo)準(zhǔn)有所差異:倒數(shù)、除法、平方根僅支持舍入到最近的偶數(shù)。單精確度中不支持反常值(denormal)及sNaN(signaling NaN);只支持兩種IEEE舍入模式(舍位與舍入到最近的偶數(shù)),這些在每條指令的基礎(chǔ)上指定,而非控制字碼;除法/平方根的精度比單精確度略低