web-dev-qa-db-ja.com

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

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

いつ__device__を使用すべきか、いつ__global__を使用すべきか?.

89
Mehdi1902

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

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

119
Eugene

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

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

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

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

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

36
FacundoGFlores
  1. __global__-GPUで実行され、CPUから呼び出されます。 <<<dim3>>>引数で実行されます。
  2. __device__-GPUから呼び出され、GPUから呼び出されます。バリアブルでも使用できます。
  3. __Host__-CPU上で実行され、CPUから呼び出されます。

例で説明します。

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 」をお読みください

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

15
sandeep.ganage

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

13
perreal

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

  1. __device__関数は、voidではなく__global__関数は常にvoidを返す必要があります。

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

7
Autodidact

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

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

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

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

7

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

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

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

6
Lorin Ahmed

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

2
harishbisht29