グローバル機能とデバイス機能の違い


108

誰もが間の違いを説明することができます__global__とは__device__

いつ使用し__device__、いつ使用し__global__ますか?

回答:


136

グローバル関数は「カーネル」とも呼ばれます。これは、CUDAカーネル呼び出しセマンティクス(<<<...>>>)を使用してホスト側から呼び出すことができる関数です。

デバイス関数は、他のデバイスまたはグローバル関数からのみ呼び出すことができます。__device__ホストコードから関数を呼び出すことはできません。


14
補足として、__global__動的並列処理を使用している場合、CUDAカーネルセマンティクス(<<< ... >>>)を使用してデバイスから関数を呼び出すこともできます。これには、CUDA 5.0および計算機能3.5以上が必要です。
トム

39

__device____global__関数の違いは次のとおりです。

__device__ 関数はデバイスからのみ呼び出すことができ、デバイスでのみ実行されます。

__global__ ホストから関数を呼び出すことができ、デバイスで実行されます。

したがって、__device__カーネル関数から関数を呼び出すので、カーネル設定を行う必要はありません。関数を「オーバーロード」することもできます。たとえば、宣言void foo(void)とを__device__ foo (void)実行すると、ホストで実行され、ホスト関数からのみ呼び出すことができます。もう1つはデバイスで実行され、デバイスまたはカーネル関数からのみ呼び出すことができます。

次のリンクにアクセスすることもできます:http : //code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions、それは私にとって便利でした。


31
  1. __global__-GPUで実行され、CPUまたはGPU *から呼び出されます。<<<dim3>>>引数付きで実行されます。
  2. __device__-GPUから呼び出され、GPUで実行されます。バリアブルにも使用できます。
  3. __host__ -CPUから呼び出され、CPUから呼び出されます。

*)__global__関数は、 compute capability 3.5 __global__以降の関数から呼び出すことができます


5
この答えは少し遅すぎます。質問がなされた時点では正解でしたが、動的並列処理の発明以来、もはや正解ではありません。
テラ

16

例を挙げて説明します。

main()
{
    // Your main function. Executed by CPU
}

__global__ void calledFromCpuForGPU(...)
{
  //This function is called by CPU and suppose to be executed on GPU
}

__device__ void calledFromGPUforGPU(...)
{
  // This function is called by GPU and suppose to be executed on GPU
}

つまり、host(CPU)関数がdevice(GPU)関数を呼び出すようにしたい場合、 ' global 'が使用されます。これを読んでください: " https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialGlobalFunctions "

そして、device(GPU)関数(むしろカーネル)が別のカーネル関数を呼び出すようにしたいときは、 ' device ' を使用します。これを読む " https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions "

これで違いを理解できます。


13

__global__cudaカーネル用で、ホストから直接呼び出すことができる関数です。__device__関数は__global__および__device__関数から呼び出すことができますが、ホストからは呼び出すことができません。


7

私はここで根拠のない推測をここでしばらく記録しています(信頼できる情報源に出会ったときにこれらを後で実証します)...

  1. __device__関数はvoid以外の戻り値の型を持つことができますが、__global__関数は常にvoidを返す必要があります。

  2. __global__関数は、GPUで実行されている他のカーネル内から呼び出して、追加のGPUスレッドを(CUDA動的並列処理モデル(別名CNP)の一部として)__device__起動し、関数は呼び出し元のカーネルと同じスレッドで実行できます。


7

__global__functionはカーネルの定義です。CPUから呼び出されると、そのカーネルはGPUで起動されます。

ただし、そのカーネルを実行する各スレッドは、たとえば2つの整数のスワッピングなど、コードを何度も実行する必要がある場合があります。したがって、Cプログラムと同じように、ここでヘルパー関数を作成できます。また、GPUで実行されるスレッドの場合、ヘルパー関数はとして宣言する必要があります__device__

したがって、デバイス関数はカーネルのスレッドから呼び出されます-1つのスレッドに対して1つのインスタンス。一方、グローバル関数はCPUスレッドから呼び出されます。


7

__global__ CUDA Cキーワード(宣言指定子)であり、関数

  1. デバイスで実行(GPU)
  2. ホスト(CPU)コードからの呼び出し。

を使用してホストコードによって起動されるグローバル関数(カーネル)<<< no_of_blocks , no_of threads_per_block>>>。各スレッドは、一意のスレッドIDによってカーネルを実行します。

ただし、__device__ホストコードから関数を呼び出すことはできません__host__ __device__。必要な場合は、両方を使用してください。


2

グローバル関数はホストからのみ呼び出すことができ、戻り値の型はありませんが、デバイス関数は他のデバイス関数のカーネル関数からのみ呼び出すことができるため、カーネル設定は必要ありません

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.