從 nVidia CUDA 1.0 正式發表起,主要的版本大概是 1.0、1.1、2.0 Beta 和現在的 2.0 Beta2。實際上,Heresy 自己是從 1.0 開始用的,早期的 0.x 版,Heresy 並沒有實際接觸到。這一篇,就來大概寫一下 Heresy 所知道,CUDA 2.0 Beta 2 的一些新東西吧∼而關於上述的其他版本更新,可以參考 Heresy 之前寫的《CUDA 1.1 Release》和《CUDA Beta 2.0 for Windows & Vista》。
新的 Compute Capability
首先,最重要的,就是他開始正式支援 nVidia GT200 系列新的 GPU,以及對應的 double 計算!在《CUDA 2.0b2 Programmers Guide》的附錄 A1,就可以看到相關的詳細資料。
目前以 Compute Capability 來看,nVidia 的顯示晶片總共有三類:
- 最原始、隨著 CUDA 1.0 版推出的 Compute Capability 1.0
這部分就是支援最一開始 CUDA 1.0 的標準了∼符合的硬體有:GeForce 8 系列最早的 G80,包含了 GeForce 8800 Ultra、8800 GTX、8800GTS 320MB/640MB 這些顯示卡。- CUDA 1.1 更新後,支援部分新功能的 Compute Capability 1.1
在 1.1 版推出後,也根據了新的硬體(G84、G86、G92、G94、G96),加入了一些新的功能;在 Programming Duide 2.0 裡是只列一項「atomic functions」。
而基本上,符合 Compute Capability 1.1 的硬體,就是除了早期的 GeForce 8800 系列以外,全部的 GeForce 8, GeForce 9 系列的顯示卡了∼- CUDA 2.0 Beta 2 發表時,正式定義的 Compute Capability 1.2 和 1.3
這邊算滿有趣的。他在規格裡有定義了 1.2,但是實際上卻沒有哪一個硬體,是只支援 1.2 的!最新的 GT200 系列顯示卡,也就是 GTX260 和 GTX280 所支援 Compute Capability 並不是 1.2,而是直接跳到 1.3 了;而同時,舊有的其他顯示卡,也都僅支援到 1.1。因此,1.2 算是列了個 Specification,但是沒有硬體支援了…
在文件裡,他還是分別列出了 1.2 和 1.3 的新規範。其中 1.2 包括了:
- shared memory 的 atomic function 和 64bit 的 global memory atomic function (Section 4.4.4)
- warp vote (see Section 4.4.5)
- 單一個 multiprocessor 的 register 數量由 8192 倍增成為 16384
- 單一個 multiprocessor 的 active warp 數量由 24 變為 32
- 單一個 multiprocessor 的 active thread 數由 768 變為 1024
實際上,1.2 的這些變更,主要應該都是根據新的 GT200 的硬體變化而改變的吧∼
而在科學計算中相當重要的 double 呢?這點則是要到 Compute Capability 1.3 才有了∼也就是說,1.3 和 1.2 唯一個差異,就是雙精度浮點數(double-precision floating-point number)的支援!
而基本上,CUDA 的 Compute Capability 應該都是向下相容的。支援 1.3 的硬體理所當然可以支援 1.2、1.1 和 1.0;但是只支援 1.1 的硬體就沒辦法支援 1.3 的 double 計算了。
此外,目前看來,CUDA 本身的版本和 Compute Capability 的版本,應該也是不完全相關了∼像是 CUDA 2.0 所支援的 3D Texture 功能,實際上也是各版本的 Compute Capability 硬體都可以使用的。
而 Heresy 本來還以為 CUDA 2.0 會直接把 Compute Capability 也推到 2.0 呢。 ^^”
API 的更新
除了 Compute Capability 的規範外,當然在 SDK 的 API 也加入了對應的修改了!這部分的資料,nVidia 有概略性的列在 C:CUDAdocCUDA_Release_Notes_2.0.txt 中。其中,改變大致包括了:New ISA Support SM 1.2、Double Precision Computing with SM 1.3、API Features 這三部分;裡面的 SM 1.2 和 1.3,應該就是指 Compute Capability 吧?
前兩者,應該就是針對 Compute Capability 1.2/1.3 的新功能進行 API 的實作。像是 warp 中的 vote 的函式(__any() 和 __any())、atomic 函式的加強、以及 double 的支援。
而第三部分,則是將部分 API 補足或增強,像是 3D Texture 部分的函式,在之前的 CUDA 2.0 Beta 時並沒有很齊全,現在應該是把這些都補上了∼不過像是範例程式 volumeRender 裡,程式似乎還有做對應的修改就是了。
範例程式的更新
一個滿明顯的變化,就是多了一個叫做「NVIDIA CUDA SDK Browser」的範例程式瀏覽器;這個東西類似 DirectX 的 sample browser,算是方便來尋找範例程式的界面了∼
而在範例程式的數量,2.0 Beta 是從 1.1 的 51 個增加到 58 個;而 2.0 Beta2 則是又增加了三個,變成 61 個。(不過在 release note 裡面是說只增加了 cudaVideoDecode、Simple Vote Intrinsics 兩個,不知道是哪裡算錯了?)
文件的更新
在 Programming Guide 來說,2.0Beta 和 1.1 的文件差異還沒有很大。不過到了 2.0 Beta2,不管是內容上還是結構上,都做了相當的更動。尤其是第二章和第三章,不但章內容有所更動(示意圖換了不少),連文章架構都改了∼
而 3.1 本來所稱的 SIMD(Single Instruction, Multiple Data) 架構,也正是改為新名詞 SIMT(single-instruction, multiple-thread) 了。
CUDA Video Decode API 和 CUDA Data Parallel Primitives library
這兩個東西在文件裡面並沒有正式提及,Heresy 是在 cudaVideoDecode 這個 example 裡看到才發現的;這兩項函式庫的 include 檔,都在 SDK 目錄下的 commoninc 中。
CUDA Video Decode API 是讓開發者可以直接去存取 nVidia GPU 上 VP2 視訊處理器的一套 API;他可以讓使用者用 GPU 來解碼並處理 MPEG1/2 和 H.264 的影片。不過這項功能只能用在支援 Compute Capability 1.1 以上的硬體,同時須搭配 Direct3D 使用。詳細的資料,可以參可此範例的 white paper。
而 CUDA Data Parallel Primitives library 是 CUDPP 的全名,之前在官方論壇也有發表過 1.0 alpha 版,其官方網站是:http://www.gpgpu.org/developer/cudpp/。
Heresy 沒有仔細研究,不過他應該是一套把一些常用的 data-parallel 演算法元件時做出來的函式庫,希望透過這些函式庫能幫助大家開發 CUDA 程式了∼
大致上,就這些吧?基本上呢,主要多的東西,都還是以 GT200 的新功能比較搶眼吧?而這部分的功能,沒有新的卡也是沒辦法測試的…不然,Heresy 到是滿想測試一下 GTX280 的效率是否真的大幅增加,在 double 的計算效率是不是真的只有 float 的 1/8?(雖然也還不知道要拿什麼來測 :p)
原始發表:CUDA 2.0 Beta2 變更整理