131

と の違いを説明できる人はい__global__ます__device__か?

いつ を使用する必要が__device__あり、いつ__global__? を使用する必要があります。

4

9 に答える 9

163

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

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

于 2012-09-11T16:18:44.487 に答える
45

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

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

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

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

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

于 2012-09-11T16:33:44.310 に答える
41
  1. __global__- CPU または GPU* から呼び出され、GPU 上で実行されます。<<<dim3>>>引数付きで実行。
  2. __device__- GPU から呼び出され、GPU 上で実行されます。変数でも使用できます。
  3. __host__- CPU から呼び出され、CPU 上で実行されます。

*)関数は、 計算機能 3.5以降の他の関数__global__から呼び出すことができます。__global__

于 2016-09-12T10:58:36.303 に答える
17

例を挙げて説明します:

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
}

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

また、デバイス (GPU) 関数 (むしろカーネル) が別のカーネル関数を呼び出すようにしたい場合は、' device ' を使用します。この「https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions」を読んでください

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

于 2014-02-11T09:49:04.710 に答える
13

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

于 2012-09-11T16:19:00.320 に答える
7

当分の間、ここにいくつかの根拠のない憶測を記録しています(信頼できる情報源に出くわしたときに、後でこれらを立証します)...

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

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

于 2014-10-18T18:56:38.477 に答える
7

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

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

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

于 2014-02-16T05:33:22.207 に答える
7

__global__CUDA C のキーワード (宣言指定子) であり、関数が

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

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

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

于 2016-07-02T06:04:17.027 に答える
2

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

于 2015-03-29T00:33:18.820 に答える