誰でも__global__
と__device__
の違いを説明できますか?
いつ__device__
を使用すべきか、いつ__global__
を使用すべきか?.
グローバル関数は「カーネル」とも呼ばれます。これは、CUDAカーネル呼び出しセマンティクスを使用してホスト側から呼び出すことができる関数です(<<<...>>>
)。
デバイス関数は、他のデバイスまたはグローバル関数からのみ呼び出すことができます。 __device__
関数をホストコードから呼び出すことはできません。
___device__
_と___global__
_関数の違いは次のとおりです。
___device__
_関数はデバイスからのみ呼び出すことができ、デバイスでのみ実行されます。
___global__
_関数はホストから呼び出すことができ、デバイスで実行されます。
したがって、カーネル関数から___device__
_関数を呼び出し、カーネル設定を設定する必要はありません。関数を「オーバーロード」することもできます。たとえば、void foo(void)
と__device__ foo (void)
を宣言すると、ホストで実行され、ホスト関数からのみ呼び出すことができます。もう1つはデバイス上で実行され、デバイスまたはカーネル関数からのみ呼び出すことができます。
次のリンクにもアクセスできます。 http://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions 、それは私にとって有用でした。
__global__
-GPUで実行され、CPUから呼び出されます。 <<<dim3>>>
引数で実行されます。__device__
-GPUから呼び出され、GPUから呼び出されます。バリアブルでも使用できます。__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 」をお読みください
これは違いを理解するのに十分なはずです。
__global__
は、ホストから直接呼び出し可能な関数であるcudaカーネル用です。 __device__
関数は、__global__
および__device__
関数から呼び出すことができますが、ホストからは呼び出せません。
しばらくの間、ここに根拠のない憶測をいくつか記録しています(後で信頼できる情報源に出くわしたときにこれらを実証します)...
__device__
関数は、voidではなく__global__
関数は常にvoidを返す必要があります。
__global__
関数は、GPUで実行されている他のカーネル内から呼び出して、CUDA動的並列化モデル(別名CNP)の一部として追加のGPUスレッドを起動できますが、__device__
関数は、呼び出し元カーネルと同じスレッドで実行されます。
__global__
はCUDA Cキーワード(宣言指定子)であり、関数、
<<< no_of_blocks , no_of threads_per_block>>>
を使用してホストコードによって起動されるグローバル関数(カーネル)。各スレッドは、一意のスレッドIDによってカーネルを実行します。
ただし、__device__
関数をホストコードから呼び出すことはできません。必要な場合は、__Host__
__device__
の両方を使用してください。
__global__
functionはカーネルの定義です。 CPUから呼び出されるたびに、そのカーネルはGPUで起動されます。
ただし、そのカーネルを実行する各スレッドは、2つの整数のスワップなど、何度も何度もコードを実行する必要がある場合があります。したがって、ここでは、Cプログラムで行うように、ヘルパー関数を作成できます。 GPUで実行されるスレッドの場合、ヘルパー関数は__device__
。
したがって、デバイス関数はカーネルのスレッドから呼び出されます-1つのスレッドに対して1つのインスタンス。一方、グローバル関数はCPUスレッドから呼び出されます。
グローバル関数はホストからのみ呼び出すことができ、戻り値の型はありませんが、デバイス関数は他のデバイス関数のカーネル関数からしか呼び出すことができないため、カーネル設定は不要です