web-dev-qa-db-ja.com

CUDAは再帰をサポートしていますか?

CUDAは再帰をサポートしていますか?

55
JuanPablo

これは、コンピューティング機能2.0およびCUDA 3.1をサポートするNVIDIAハードウェアで実行されます。

CUDAに追加された新しい言語機能C/ C++ include

関数ポインターと再帰のサポートにより、多くの既存のアルゴリズムをFermi GPUに簡単に移植できます。

http://developer.nvidia.com/object/cuda_3_1_downloads.html

関数ポインター:http://developer.download.nvidia.com/compute/cuda/sdk/website/CUDA_Advanced_Topics.html#FunctionPointers

再帰:NVIDIAのWebサイトでコードサンプルを見つけることができませんが、 フォーラム でこれを投稿します:

__device__ int fact(int f)
{
  if (f == 0)
    return 1;
  else
    return f * fact(f - 1);
}
46
Stringer

はい、 NVIDIA CUDAプログラミングガイドを参照してください

device関数は、計算機能2.0のデバイス用にコンパイルされたデバイスコードでの再帰のみをサポートします。

それらを使用するには、Fermiカードが必要です。

12

特定のチップの再帰のみをサポートしていますが、「エミュレートされた」再帰を回避できる場合があります: CUDAレイトレーサーにコンパイル時の再帰をどのように使用したかを確認

9
ttsiodras

CUDA 4.1リリースでは、CUDAは__global__関数ではなく__device__関数の再帰のみをサポートします。

7
username_4567

互換性のあるデバイスでの2.0計算機能以降のみ

5
Arturo Garcia

もちろんそうですが、そうするためにはケプラーアーキテクチャが必要です。クラシッククイックソートに関する最新の例をご覧ください。

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がサポートしているかどうかはわかりませんが、決して読んではいけません。 :\しかし、ケプラーは確かにそうします。 =)

3
Hong Zhou

CUDA 3.1は再帰をサポートします

2
Jan C

再帰アルゴリズムは、スタックとループで実装できます。それはかなり面倒なことですが、本当に再帰が必要な場合はこれでうまくいくでしょう。

2
dicroce

アルゴリズムが多くの再帰を呼び出す場合、サポートするかどうかにかかわらず、アルゴリズムはGPU向けに設計されていません。アルゴリズムを再設計するか、CPUを改善します。どちらの方法でも優れています(多くの場合、より優れていると思います)。 GPU。

1
user0002128

ええ、それは実際のバージョンでサポートされています。ただし、再帰関数を実行できるという事実にもかかわらず、実行スタックからのメモリ割り当ては予測できない(再帰関数は、再帰の真の深さを知るために実行する必要がある)ことに注意してください。あなたの目的には十分ではなく、デフォルトのスタックサイズを手動で増やす必要があるかもしれません

0
Mr.PotatusVII

はい、再帰をサポートしています。ただし、GPUで再帰を実行することはお勧めできません。各スレッドがそれを行うためです。

0
palebluedot