CUDAは再帰をサポートしていますか?
これは、コンピューティング機能2.0およびCUDA 3.1をサポートするNVIDIAハードウェアで実行されます。
CUDAに追加された新しい言語機能C/ C++ include:
関数ポインターと再帰のサポートにより、多くの既存のアルゴリズムをFermi GPUに簡単に移植できます。
http://developer.nvidia.com/object/cuda_3_1_downloads.html
再帰:NVIDIAのWebサイトでコードサンプルを見つけることができませんが、 フォーラム でこれを投稿します:
__device__ int fact(int f)
{
if (f == 0)
return 1;
else
return f * fact(f - 1);
}
はい、 NVIDIA CUDAプログラミングガイドを参照してください :
device関数は、計算機能2.0のデバイス用にコンパイルされたデバイスコードでの再帰のみをサポートします。
それらを使用するには、Fermiカードが必要です。
特定のチップの再帰のみをサポートしていますが、「エミュレートされた」再帰を回避できる場合があります: CUDAレイトレーサーにコンパイル時の再帰をどのように使用したかを確認 。
CUDA 4.1リリースでは、CUDAは__global__関数ではなく__device__関数の再帰のみをサポートします。
互換性のあるデバイスでの2.0計算機能以降のみ
もちろんそうですが、そうするためにはケプラーアーキテクチャが必要です。クラシッククイックソートに関する最新の例をご覧ください。
http://blogs.nvidia.com/2012/09/how-tesla-k20-speeds-up-quicksort-a-familiar-comp-sci-code/
私の知る限り、最新のKepler GK110のみが動的並列処理をサポートしています。これにより、この種の再帰的な呼び出しとカーネル内での新しいスレッドの生成が可能になります。ケプラーGK110以前は不可能でした。また、すべてのKeplerアーキテクチャがこれをサポートしているわけではなく、GK110のみがサポートしていることに注意してください。
再帰が必要な場合は、おそらくTesla K20が必要です。 Fermiがサポートしているかどうかはわかりませんが、決して読んではいけません。 :\しかし、ケプラーは確かにそうします。 =)
CUDA 3.1は再帰をサポートします
再帰アルゴリズムは、スタックとループで実装できます。それはかなり面倒なことですが、本当に再帰が必要な場合はこれでうまくいくでしょう。
アルゴリズムが多くの再帰を呼び出す場合、サポートするかどうかにかかわらず、アルゴリズムはGPU向けに設計されていません。アルゴリズムを再設計するか、CPUを改善します。どちらの方法でも優れています(多くの場合、より優れていると思います)。 GPU。
ええ、それは実際のバージョンでサポートされています。ただし、再帰関数を実行できるという事実にもかかわらず、実行スタックからのメモリ割り当ては予測できない(再帰関数は、再帰の真の深さを知るために実行する必要がある)ことに注意してください。あなたの目的には十分ではなく、デフォルトのスタックサイズを手動で増やす必要があるかもしれません
はい、再帰をサポートしています。ただし、GPUで再帰を実行することはお勧めできません。各スレッドがそれを行うためです。