技术开发 频道

nVidia CUDA API(上)

  【IT168 文档】CUDA 的 API 架構,大概分成「C 語言的 extension」、「runtime library」兩部分。extension 的部分,提供了 C 的一些延伸,來訂一 CUDA 的變數、程式等等;在最簡單的 case 裡,應該只要用到 extension 的部分就夠了~而 runtime library 的部分,則又提供了一些 CUDA device 的控制函式,以及一些針對 GPU 編寫的特殊的函式。

  接下來,先講一些一定要知道的 extension 吧。

  首先,CUDA 在 C 的 extension 分成四種:Function type qualifiers、Variable type qualifiers、Directive to specify how a kernel is executed、Built-in variables;下面來各自做一些簡短的介紹。

  Function type qualifiers

  用來指定 function 是要在 host 或 device 上執行,以及是用來被 host 或 device 呼叫。他的類別有三種:

  •   __device__

  在 device 上執行,且只能被 device 呼叫。

  同時,他永遠是 inline function。

  •   __global__

  將 function 宣告成一個 kernel,在 device 上執行,只能被 host 呼叫。

  他的 return type 必須要是 void;傳入的參數會是透過 shared memory 給 device,大小不能超過 256byte(這個 Heresy 比較不清楚)。而在乎叫時,必須要指定執行的參數(請參考下面的「Directive to specify how a kernel is executed」)。

  •   __host__

  在 host 上執行,且只能被 host 呼叫。(相當於一般的 function)

  如果沒有指定的話,自然就是一般的 function,和 __host__ 一樣了。而 __host__ 和 __device__ 可以同時使用,這樣 function 會編譯成同時可以在 device 和 host 執行。

  而在 device 上執行的function(__device__ 和 __global__)有一些基本的限制:

  • 不支援遞迴
  • 不能有 static 變數
  • 不能使用 variable number of arguments

  Variable type qualifiers

  在變數類型方面,是用來指定記憶體的類型。分成三種:

  •   __device__
  1. 宣告變數存在 device 上;可以和下面兩者同時使用,來做更進一步的設定。如果沒有額外指定的話,那這個變數會
  2. 存在 global memory 空間
  3. 生命週期和程式相同

  可以被 grid 中的所有 thread 透過 runtime library 存取。

  •   __constant__
  1. 可和 __device__ 同時使用,會將變數宣告成:
  2. 存在 constant memory 空間
  3. 生命週期和程式相同

  可以被 grid 中的所有 thread 透過 runtime library 存取。

  •   __shared__

  可和 __device__ 同時使用,會將變數宣告成:

  1. 存在 thread block 的 shared memory 空間
  2. 生命週期和 thread block 相同
  3. 只能被 block 中的 thread 存取
0
相关文章