CUDAドライバーとAPI。 CUDAランタイム
質問
CUDAアプリケーションを作成する場合、この画像に示されているように、ドライバーレベルまたはランタイムレベルで作業できます(ライブラリは高度な数学のためのCUFFTおよびCUBLASです):
(ソース: tomshw.it )
この2つの間のトレードオフは、低レベルAPIのパフォーマンス向上ですが、コードの複雑さが増すという犠牲を払っていると思います。具体的な違いは何ですか?高レベルAPIでできない重要なことはありますか?
C#との相互運用にCUDA.netを使用していますが、これはドライバーAPIのコピーとして構築されています。これにより、C#でかなり複雑なコードを多数作成することが推奨されますが、ランタイムAPIを使用すると、C ++で同等のコードがより簡単になります。この方法で勝つために何かありますか?私が見ることができる1つの利点は、インテリジェントなエラー処理をC#コードの残りの部分と統合する方が簡単だということです。
解決
CUDAランタイムを使用すると、CUDAカーネルをコンパイルして実行可能ファイルにリンクできます。つまり、アプリケーションでキュービンファイルを配布したり、ドライバーAPIを介してキュービンファイルを読み込んだりする必要はありません。既に述べたように、一般的に使いやすいです。
対照的に、ドライバーAPIはプログラミングが困難ですが、CUDAの使用方法をより詳細に制御できます。プログラマは、初期化、モジュールの読み込みなどを直接処理する必要があります。
明らかに、より詳細なデバイス情報は、ランタイムAPIよりもドライバーAPIを介して照会できます。たとえば、デバイスで使用可能な空きメモリは、ドライバーAPIを介してのみ照会できます。
CUDAプログラマーガイドから:
2つのAPIで構成されています:
- CUDAドライバーAPIと呼ばれる低レベルAPI
- CUDAランタイムAPIと呼ばれる上位レベルのAPI CUDAドライバーAPI。
これらのAPIは相互に排他的です。アプリケーションはいずれか1つを使用する必要があります その他。
CUDAランタイムは、暗黙的に提供することでデバイスコード管理を容易にします 初期化、コンテキスト管理、モジュール管理。 Cホストコード nvccによって生成されるのはCUDAランタイムに基づいています(セクション4.2.5を参照)。 このコードにリンクするアプリケーションは、CUDAランタイムAPIを使用する必要があります。
対照的に、CUDAドライバーAPIはより多くのコードを必要とし、プログラミングが難しく、 デバッグしますが、より良いレベルの制御を提供し、言語に依存しません cubinオブジェクトを扱います(セクション4.2.5を参照)。特に、それはより困難です 実行以来、CUDAドライバーAPIを使用してカーネルを構成および起動する 構成およびカーネルパラメーターは、明示的な関数呼び出しで指定する必要があります セクション4.2.3で説明されている実行構成構文の代わりに。また、デバイス エミュレーション(セクション4.5.2.9を参照)は、CUDAドライバーAPIでは機能しません。
API間に顕著なパフォーマンスの違いはありません。カーネルがメモリをどのように使用し、GPU上でどのように(ワープとブロックで)レイアウトされるかは、より顕著な効果をもたらします。
他のヒント
マルチスレッドアプリケーションでライブラリを展開するには、ドライバーAPIによって提供されるCUDAコンテキストの制御が重要であることがわかりました。私のクライアントのほとんどは、GPUアクセラレーションを既存のアプリケーションに統合したいと考えており、最近では、ほとんどすべてのアプリケーションがマルチスレッド化されています。すべてのGPUコードが同じスレッドから初期化、実行、および割り当て解除されることを保証できなかったため、ドライバーAPIを使用する必要がありました。
ランタイムAPIでのさまざまな回避策の最初の試みはすべて、時には壮大な方法で失敗に終わりました-異なるスレッドから間違ったCUDA呼び出しのセットを実行するだけで、マシンを繰り返し、即座に再起動できることがわかりました。
Driver APIを介してすべてを移行したため、すべて順調です。
J
注意すべき重要な点:
まず、APIの違いはホスト側のコードにのみ適用されます。カーネルはまったく同じです。ホスト側では、ドライバーAPIの複雑さは非常に簡単です。基本的な違いは次のとおりです。
ドライバーAPIでは、コンテキストなどのランタイムAPIでは利用できない機能にアクセスできます。
エミュレータは、ランタイムAPI用に記述されたコードでのみ機能します。
おお、現在非常に便利なライブラリであるcudppは、ランタイムAPIでのみ動作します。
引数のアライメントとドライバーAPIにはいくつかの実際の問題があります。詳細については、CUDA 2.2ベータ版(またはそれ以降)のドキュメントをご覧ください。