技术开发 频道

nVidia CUDA API(下)

  裝置管理

  一般情況下,可能用不到這一部分的 API 吧~但是如果有兩個以上的 CUDA Device 的話,就須要透過這些函式來選擇要用的裝置了~此外,也可以先透過這些函式,來確認機器上的一些基本規格。

  這部分的函式不多,有下面幾個:

  • cudaGetDeviceCount( int* count )

  取得目前機器上,支援 CUDA 的 device 數目,會把結果存在 count 中。函式則會 return 一個 cudaError_t,用來表示 CUDA 的錯誤。

  • cudaGetDeviceProperties( cudaDeviceProp* prop, int dev )

  取得目前機器上第 dev 個 device 的屬性;prop 的結構會是:

struct cudaDeviceProp {
  
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 也不是很清楚就是了

0
相关文章