誰もが間の違いを説明することができます__global__
とは__device__
?
いつ使用し__device__
、いつ使用し__global__
ますか?
誰もが間の違いを説明することができます__global__
とは__device__
?
いつ使用し__device__
、いつ使用し__global__
ますか?
回答:
__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またはGPU *から呼び出されます。<<<dim3>>>
引数付きで実行されます。__device__
-GPUから呼び出され、GPUで実行されます。バリアブルにも使用できます。__host__
-CPUから呼び出され、CPUから呼び出されます。*)__global__
関数は、
compute capability 3.5 __global__
以降の関数から呼び出すことができます
。
例を挙げて説明します。
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 "
これで違いを理解できます。
私はここで根拠のない推測をここでしばらく記録しています(信頼できる情報源に出会ったときにこれらを後で実証します)...
__device__
関数はvoid以外の戻り値の型を持つことができますが、__global__
関数は常にvoidを返す必要があります。
__global__
関数は、GPUで実行されている他のカーネル内から呼び出して、追加のGPUスレッドを(CUDA動的並列処理モデル(別名CNP)の一部として)__device__
起動し、関数は呼び出し元のカーネルと同じスレッドで実行できます。
__global__
functionはカーネルの定義です。CPUから呼び出されると、そのカーネルはGPUで起動されます。
ただし、そのカーネルを実行する各スレッドは、たとえば2つの整数のスワッピングなど、コードを何度も実行する必要がある場合があります。したがって、Cプログラムと同じように、ここでヘルパー関数を作成できます。また、GPUで実行されるスレッドの場合、ヘルパー関数はとして宣言する必要があります__device__
。
したがって、デバイス関数はカーネルのスレッドから呼び出されます-1つのスレッドに対して1つのインスタンス。一方、グローバル関数はCPUスレッドから呼び出されます。
グローバル関数はホストからのみ呼び出すことができ、戻り値の型はありませんが、デバイス関数は他のデバイス関数のカーネル関数からのみ呼び出すことができるため、カーネル設定は必要ありません
__global__
動的並列処理を使用している場合、CUDAカーネルセマンティクス(<<< ... >>>)を使用してデバイスから関数を呼び出すこともできます。これには、CUDA 5.0および計算機能3.5以上が必要です。