CUDA は、再帰の深さ 1 が達成されることを保証しません。同様に、従来の OS は、新しいプロセス/スレッドの起動が成功することを保証しません。たとえば、次のプログラムがあるとします。
int main() {
pid_t pid;
while (pid = fork ());
while (true) {
dummy<<<1, 1024>>> ();
}
}
__global void dummy() {}
ある時点で何かが失敗します - CPU または GPU メモリが不足します。同様に、GPU では失敗する可能性があります (エラーを返します - CUDA または fork のいずれかが -1 を返します)。
別の見方をすると、最悪の場合、各起動には(2^31-1)^2*(2^10-1) ≃ 2^72
それぞれスレッドを持つブロックが存在する可能性があります。2^10
つまり、単一の起動では、2^82
スレッドを持つことができます。現在、各再帰は指数関数的であるため、最悪の場合、起動後にスレッドを終了しても、2^1968
スレッドのスケジューリングを保証する必要があります。各スレッドの状態が 1/32 ビットの場合、ワープが終了したかどうかにかかわらず、2^1945
GiB のメモリが必要になります (これは、観測された宇宙の情報容量よりも「わずかに」多く、つまり2^1595
2 倍以上です)。
したがって、それは間違いなくケース B であり、ケース A である可能性はありません (ワープの状態には、少なくとも命令ポインターが含まれている必要があります)。分岐要因に応じて、同期する場合、アルゴリズムの 15-19 の再帰の深さが達成可能になる場合があります。
編集:再帰的な起動の代わりに単純な再帰を意味する場合、実際にはスタックによって制限されます。正確なコードによっては、Fermi+ では事実上無限になる場合があります (Tesla 生成は再帰 IIRC をサポートしていません)。同様に、最小の深さが保証されているわけではありません - スタック/ローカルメモリに大きな配列を割り当てると、スペースが不足します (オプティマイザはそれをうまく取り除きます)。