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