0

私は CUDA 開発 (バージョン 4 を使用) の方法を学び始めたばかりで、使用する予定の別のカードで開発できるかどうか疑問に思っていましたか? 私が学ぶにつれて、違いが私に影響を与えるかどうかを監視できるように、これを知っておくとよいでしょう.

Nvidia GeForce 320M グラフィック カード (非常に基本的なラップトップ統合カード) を搭載した 2010 年半ばの macbook pro を持っていますが、EC2 の NVIDIA Tesla “Fermi” M2050 GPU でコードを実行する予定です。ラップトップでローカルに開発し、最小限の変更で EC2 で実行できるかどうか疑問に思っています (個人的なプロジェクトでこれを行っており、開発に 2.4 ドルを費やしたくありません)。

具体的な質問は、再帰が新しいカードでサポートされていると聞きました (私のラップトップではサポートされていない可能性があります)。ラップトップ GPU で再帰を実行するとどうなりますか? エラーを発生させますか、それとも実行しますがハードウェア機能を利用しませんか? (これに対する特定の答えは必要ありませんが、これは私が得ていることのようなものです)。

これが問題になる場合、現在のカードで利用できない機能のエミュレーターはありますか? または、SDK はそれをエミュレートしますか?

この質問が基本的すぎる場合は申し訳ありません。

4

3 に答える 3

3

はい、開発と運用に異なる GPU を使用することは、かなり一般的な方法です。nVidia GPU 世代は下位互換性があるため、プログラムが古いカード (つまり 320M (CC1.3)) で実行される場合、M2070 (CC2.0) でも確実に実行されます。

ただし、最大のパフォーマンスを得たい場合は、使用するのと同じアーキテクチャでプログラムをプロファイリングする必要がありますが、通常、1.x から 2.0 に移行するときに変更を加えることなく、すべてがうまく機能します。どのエミュレーターも、古い GPU で実行するよりも、何が起こっているかについてはるかに悪いビューを提供します。

再帰について: 1.3 アーキテクチャ用に明らかな再帰を使用してプログラムをコンパイルしようとすると、コンパイル時エラーが発生します。

nvcc rec.cu -arch=sm_13
./rec.cu(5): Error: Recursive function call is not supported yet: factorial(int)

より複雑なケースでは、プログラムはコンパイルされるかもしれませんが (コンパイラーが再帰を検出するのにどれほど賢いかはわかりません)、確実に機能しません: 1.x アーキテクチャーでは呼び出しスタックがなく、すべての関数呼び出しは実際にはインライン化されていました。したがって、再帰は技術的に不可能です。

ただし、再帰は絶対に避けることを強くお勧めします。再帰は GPGPU プログラミング パラダイムに反するものであり、パフォーマンスが大幅に低下することは間違いありません。ほとんどのアルゴリズムは、再帰を使用せずに簡単に書き直すことができ、GPU だけでなく CPU でもそれらを利用する方がはるかに好ましい方法です。

于 2012-05-06T18:50:05.657 に答える
2

最初はCudaバージョンはそれほど重要ではありません。さらに重要なのは、カードの計算能力です。

cc 1.0 を使用してカーネルをプログラムし、それらが将来的に拡張可能である場合、問題は発生しません。

アプリケーションに必要な最小 CC レベルを自分で選択します。

プロパティを使用して必要なパラメーターを計算し、ptx jit コンパイルを使用します。

カーネルが任意の入力サイズのデータ​​を処理でき、カーネル起動構成が数千のスレッドにわたってスケーリングされる場合、将来のバージョンでもスケーリングされます。

私のプロジェクトでは、すべてのカーネルがブロックごとに一定数のスレッドを使用しました。これは、ストリーミング マルチプロセッサごとの常駐スレッド数をストリーミング マルチプロセッサごとの常駐ブロック数で割った値に等しくなり、100% の占有率に達しました。一部のカーネルでは、ブロックごとに 2 の倍数のスレッドが必要になるため、すべての cc バージョンで上記の式が 2 の倍数のブロック サイズを保証するわけではないため、このケースも処理しました。

一部のカーネルは共有メモリを使用し、そのサイズも cc レベルのプロパティによって差し引かれていました。

このデータは、ユーティリティ クラスで (cudaGetDeviceProperties) を使用して受信され、カーネルをコンパイルする ptx jit を使用して、すべてのデバイスで変更を加えることなく機能しました。私は cc 1.1 デバイスでプログラミングし、最新の cuda カードで何も変更せずにテストを実行しました!

すべてのカーネルは、64 ビット長の入力データで動作し、3D グリッドのすべての次元を利用するようにプログラムされています。(私は 1 年以内にこのプロジェクトに取り組み続けると確信しているので、これは必要でした)

1 つを除くすべてのカーネルは、100% の occ を保持しながら、cc 1.0 レジスタの制限を超えませんでした。そのため、使用されているカードの cc が 1.2 未満の場合、カーネルに maxregcount コマンドを追加して、引き続き 100% の cc を強制しました。

これは可能な限り最高のパフォーマンスを保証するものではありません!

可能な限り最高のパフォーマンスを得るには、各カーネルをそのパラメーターとリソースに関して分析する必要があります。

これは、すべてのアプリケーションと要件に対して実用的ではない可能性があります

于 2012-05-06T18:53:16.760 に答える
0

CUDA 5 を搭載した 2012 年第 4 四半期に利用可能な NVidia Kepler K20 GPU は、再帰アルゴリズムをサポートします。

于 2012-05-25T15:57:00.647 に答える