と の違いを説明できる人はい__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__
。
グローバル関数はホストからのみ呼び出すことができ、戻り値の型はありませんが、デバイス関数は他のデバイス関数のカーネル関数からのみ呼び出すことができるため、カーネル設定は必要ありません