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


65

誰でも__global____device__の違いを説明できますか?

いつ__device__を使用し、__global__をいつ使うべきですか?

93

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

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

+7

動的並列処理を使用している場合は、CUDAカーネルのセマンティクス(<<<...> >>)を使用するデバイスから、__global__関数を呼び出すこともできます。これにはCUDA 5.0と計算機能3.5以上が必要です。 11 9月. 122012-09-11 17:44:18


10

__global__は、クーダカーネル用で、ホストから直接呼び出し可能な関数です。 __device__関数は、__global__および__device__関数から呼び出すことはできますが、ホストから呼び出すことはできません。 __device____global__機能間


28

違いは次のとおり

__device__機能は、デバイスから呼び出すことができ、それは唯一のデバイスで実行されます。

__global__機能はホストから呼び出すことができ、デバイス内で実行されます。

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

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


12

私は一例でそれを説明します:

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 
} 

を、すなわち、我々は(GPU)機能デバイスを呼び出すためのホスト(CPU)機能をしたいときは、「グローバル」は使用されています。 "https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialGlobalFunctions"

そして、デバイス(GPU)関数(カーネルではなく)が別のカーネル関数を呼び出すときは、「デバイス」を使用します。この "https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions"

これは違いを理解するのに十分であるはずです。


5

__global__機能はカーネルの定義です。 CPUから呼び出されるたびに、そのカーネルがGPU上で起動されます。

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

したがって、デバイス関数はカーネルのスレッドから呼び出されます.1つのスレッドに対して1つのインスタンスが呼び出されます。一方、グローバル関数はCPUスレッドから呼び出されます。私は(私はいくつかの信頼できるソースに遭遇したときに、私は、後でこれらを実証します)当分の間、ここにいくつかの根拠のない憶測を記録しています


6

...

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

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


2

グローバル関数のみをホストから呼び出すことができ、デバイスの機能のみ


5

を設定するカーネルを必要とするので、dosen't他のデバイスの機能のカーネル関数から呼び出すことができますが、彼らは戻り値の型を持っていません__golbal__関数と言うCUDA Cキーワード(宣言指定子)であり、

  1. は、デバイス上でホスト(CPU)コードから(GPU)
  2. コールを実行します。 < < < no_of_blocks、no_of threads_per_block >>>を使用してホスト・コードによって起動

グローバル関数(カーネル)。 各スレッドは、固有のスレッドIDによってカーネルを実行します。 CPUから呼び出されたGPU上で動作し、 - あなたはそれが__host____device__


11
  1. __global__の両方を使用する実行する必要がありcode.if

    しかし__device__機能は、ホストから呼び出すことはできません。 <<<dim3>>>引数で実行されます。

  2. __device__ - GPUから実行され、GPUで実行されます。バリバリにも使用できます。
  3. __host__ - CPUから実行され、CPUから呼び出されます。
+1

この回答はちょっと遅すぎます。質問が尋ねられた時点では正しいですが、[動的並列処理](https://devblogs.nvidia.com/parallelforall/introduction-cuda)が発明されて以来、これはもう正しくありません-dynamic-parallelism /)。 12 9月. 162016-09-12 11:47:03