4

cuda 4.0 は、ローカル メモリまたは共有メモリを使用した再帰をサポートしていますか? システムレベルの再帰ではプログラムをサポートできないため (おそらく再帰のレベルが多すぎるため)、グローバルメモリを使用してスタックを自分で維持する必要があります。再帰が深くなると、スレッドは機能しなくなります。
だから私は本当にCUDAでデフォルトの再帰がどのように機能するか知りたいのですが、共有メモリのローカルメモリを使用していますか? ありがとう!

4

1 に答える 1

11

再帰を使用するには、アーキテクチャ >= sm_20 を必要とする ABI を使用する必要があります。ABI には、スタック フレームの使用を含む関数呼び出し規約があります。スタック フレームはローカル メモリに割り当てられます (「ローカル」とは「スレッド ローカル」、つまりスレッド専用のストレージを意味します)。CUDA メモリ空間の基本情報については、CUDA C プログラミング ガイドを参照してください。さらに、この前の質問を見たいと思うかもしれません: CUDA はカーネルのスタック フレームをどこに割り当てますか?

深く再帰的な関数の場合、デフォルトのスタック サイズを超える可能性があります。たとえば、現在のシステムでは、デフォルトのスタック サイズは 1024 バイトです。CUDA API 関数を介して現在のスタック サイズを取得できますcudaDeviceGetLimit()。CUDA API 関数を介してスタック サイズを調整できますcudaDeviceSetLimit()

cudaError_t stat;
size_t myStackSize = [your preferred stack size];
stat = cudaDeviceSetLimit (cudaLimitStackSize, myStackSize);

スタック フレームに必要なメモリの合計量は、少なくともスレッドごとのサイズにカーネル起動で指定されたスレッド数を掛けたものであることに注意してください。多くの場合、割り当ての粒度が原因で大きくなる可能性があります。そのため、スタック サイズを大きくするとすぐにメモリを消費する可能性があり、深く再帰的な関数では、GPU に割り当てられるよりも多くのローカル メモリが必要になる場合があります。

最近の GPU では再帰がサポートされていますが、再帰を使用すると、関数呼び出しのオーバーヘッドが原因でコードのパフォーマンスがかなり低下する可能性があるため、実装しているアルゴリズムの反復バージョンが GPU により適しているかどうかを確認することをお勧めします。 .

于 2013-09-26T03:16:48.867 に答える