45

CUDA アプリケーションを作成する場合、次の図に示すように、ドライバー レベルまたはランタイム レベルで作業できます (ライブラリは、高度な数学用の CUFFT および CUBLAS です)。

CUDA層モデル
(ソース: tomshw.it )

この 2 つのトレードオフは、低レベルの API のパフォーマンスが向上することですが、コードの複雑さが増すという犠牲を払っていると思います。具体的な違いは何ですか?高レベル API では実行できない重要な点はありますか?

私は C# との相互運用に CUDA.net を使用しており、ドライバー API のコピーとしてビルドされています。これにより、C# でかなり複雑なコードを大量に記述することが奨励されますが、C++ に相当するものはランタイム API を使用するとより単純になります。このやり方で何か得があるのだろうか?私が理解できる利点の 1 つは、インテリジェントなエラー処理を他の C# コードと簡単に統合できることです。

4

4 に答える 4

48

CUDA ランタイムを使用すると、CUDA カーネルをコンパイルして実行可能ファイルにリンクできます。これは、cubin ファイルをアプリケーションで配布したり、ドライバー API を介してそれらをロードしたりする必要がないことを意味します。おっしゃる通り、普通に使いやすいです。

対照的に、ドライバー API はプログラミングが難しくなりますが、CUDA の使用方法をより詳細に制御できます。プログラマーは、初期化、モジュールのロードなどを直接処理する必要があります。

明らかに、ランタイム API よりもドライバー API を介して、より詳細なデバイス情報を照会できます。たとえば、デバイスで使用可能な空きメモリは、ドライバー API を介してのみ照会できます。

CUDA プログラマーズ ガイドから:

これは、次の 2 つの API で構成されています。

  • CUDA ドライバー API と呼ばれる低レベル API、
  • CUDA ドライバー API の上に実装される CUDA ランタイム API と呼ばれる上位レベルの API。

これらの API は相互に排他的です。アプリケーションは、どちらか一方を使用する必要があります。

CUDA ランタイムは、暗黙的な初期化、コンテキスト管理、およびモジュール管理を提供することにより、デバイス コード管理を容易にします。nvcc によって生成される C ホスト コードは CUDA ランタイムに基づいているため (セクション 4.2.5 を参照)、このコードにリンクするアプリケーションは CUDA ランタイム API を使用する必要があります。

対照的に、CUDA ドライバー API は、より多くのコードを必要とし、プログラミングとデバッグが難しくなりますが、cubin オブジェクトのみを扱うため、より優れたレベルの制御を提供し、言語に依存しません (セクション 4.2.5 を参照)。特に、セクション 4.2.3 で説明されている実行構成構文ではなく、明示的な関数呼び出しで実行構成とカーネル パラメーターを指定する必要があるため、CUDA ドライバー API を使用してカーネルを構成および起動することはより困難です。また、デバイス エミュレーション (セクション 4.5.2.9 を参照) は、CUDA ドライバー API では機能しません。

API 間に顕著なパフォーマンスの違いはありません。カーネルがメモリをどのように使用するか、およびそれらが GPU で (ワープとブロックで) どのように配置されるかは、はるかに顕著な効果をもたらします。

于 2008-10-31T18:55:14.147 に答える
22

マルチスレッド アプリケーションでのライブラリの展開では、ドライバー API によって提供される CUDA コンテキストの制御が重要であることがわかりました。私のクライアントのほとんどは、GPU アクセラレーションを既存のアプリケーションに統合したいと考えており、最近ではほとんどすべてのアプリケーションがマルチスレッド化されています。すべての GPU コードが同じスレッドから初期化、実行、割り当て解除されることを保証できなかったため、ドライバー API を使用する必要がありました。

ランタイム API でさまざまな回避策を試みた最初の試みはすべて失敗に終わり、時には見事な形で失敗しました。異なるスレッドから間違った CUDA 呼び出しを実行するだけで、マシンを即座に再起動できることがわかりました。

Driver API を介してすべてを移行したため、すべてが順調に進んでいます。

J

于 2010-03-25T22:48:36.430 に答える
4

注意すべき重要な点がいくつかあります。

まず、API 間の違いはホスト側のコードにのみ適用されます。カーネルはまったく同じです。ホスト側では、ドライバー API の複雑さはごくわずかです。基本的な違いは次のとおりです。

ドライバ API では、コンテキストなどのランタイム API では利用できない機能にアクセスできます。

エミュレーターは、ランタイム API 用に記述されたコードでのみ機能します。

ああ、現在、非常に便利なライブラリである cudpp は、ランタイム API でのみ動作します。

于 2009-03-01T14:21:54.810 に答える
0

引数の配置とドライバー API には実際の問題がいくつかあります。詳細については、CUDA 2.2 ベータ版 (またはそれ以降) のドキュメントを参照してください。

于 2009-03-20T16:39:48.810 に答える