裝置管理
一般情況下,可能用不到這一部分的 API 吧~但是如果有兩個以上的 CUDA Device 的話,就須要透過這些函式來選擇要用的裝置了~此外,也可以先透過這些函式,來確認機器上的一些基本規格。
這部分的函式不多,有下面幾個:
- cudaGetDeviceCount( int* count )
取得目前機器上,支援 CUDA 的 device 數目,會把結果存在 count 中。函式則會 return 一個 cudaError_t,用來表示 CUDA 的錯誤。
- cudaGetDeviceProperties( cudaDeviceProp* prop, int dev )
取得目前機器上第 dev 個 device 的屬性;prop 的結構會是:
char name[256]; //裝置名稱
size_t totalGlobalMem; //Device 的 global memory 總量
size_t sharedMemPerBlock; //Device 的 shared memory 總量
int regsPerBlock; //每一個 block 的 registers 數量
int warpSize; //warp size
size_t memPitch; //最大的 memory pitch
int maxThreadsPerBlock; //Block 的最大 thread 數
int maxThreadsDim[3]; //Block 中 thread 最大的維度
int maxGridSize[3]; //Grid 中 block 的最大維度
size_t totalConstMem; //Device 的 constant memory 總量
int major; //主要版本編號
int minor; //次要版本編號
int clockRate; //時脈
size_t textureAlignment; //alignment requirement mentioned
};
- cudaChooseDevice( int* dev, const cudaDeviceProp* prop)
在目前的 device 中,找一個最符合給定的 prop 的,並把他的索引直存在 dev 裡。
- cudaSetDevice(int dev)
指定現在要使用第 dev 個 device。
- cudaGetDevice(int* dev)
取得目前正在使用的 device 的索引編號,儲存在 dev 中。
快速數學計算
從上面的列表可以發現,在 common component 和 device component 中,都有數學函式的功能。其中,common component 中的應該算是一般的數學計算函式,而 device component 所提供的,則是精確度較低,但是速度較快的版本!
也就是說 CUDA 在 device component 的部分,提供了部分數學計算的函式,是以 GPU 來做計算的快速版本。這些函式在 CUDA 中統一以「__」來做開頭,例如 __sinf(x)、__fadd_rz(x,y)、__logf(x) 等等。這些函式在《CUDA Programming Guide 1.0》的 Appendix B 中,可以找到比較完整的列表可以參考。
而在 nvcc 的編譯參數中,也還提供了一個「-use_fast_math」的參數,可以強制所有可以的數學計算函數,都使用叫快速的版本來計算。這在精確度比較不重要的情況下,應該可以對效能有些增益。
上面講的部分,都是 runtime API 的部分;大部分的函式,都是以 cuda 來做為開頭。而實際上,CUDA 還有提供 Driver API;這一部分的函式會是以 cu 來做為開頭。而許多函式,都可以和 runtime API 來做一一對應。而以文件裡的說法,Driver API 應該是比 runtime API 來的低階,但是實際的差異,Heresy 也不是很清楚就是了