web-dev-qa-db-ja.com

CUDAドライバーAPIとCUDAランタイム

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

CUDA layer model
(ソース: tomshw.it

2つの間のトレードオフは、low-evel APIのパフォーマンスの向上であると思いますが、コードの複雑さが増します。具体的な違いは何ですか?また、高レベルAPIで実行できない重要なことはありますか?

C#との相互運用にCUDA.netを使用していますが、これはドライバーAPIのコピーとして構築されています。これにより、C#でかなり複雑なコードをたくさん書くことが奨励されますが、C++の同等のコードは、ランタイムAPIを使用するとより簡単になります。このようにして勝つことはありますか?私が見ることができる1つの利点は、インテリジェントなエラー処理を残りのC#コードと統合する方が簡単なことです。

40

CUDAランタイムは、CUDAカーネルをコンパイルして実行可能ファイルにリンクすることを可能にします。つまり、アプリケーションでキュービンファイルを配布したり、ドライバー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を参照)。特に、CUDAドライバーAPIを使用してカーネルを構成および起動するのはより困難です。これは、実行構成とカーネルパラメーターを、セクション4.2.3で説明されている実行構成構文ではなく、明示的な関数呼び出しで指定する必要があるためです。また、デバイスエミュレーション(セクション4.5.2.9を参照)は、CUDAドライバーAPIでは機能しません。

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

43
mch

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

ランタイムAPIでのさまざまな回避策での最初の試みはすべて失敗につながり、時には壮観な方法で失敗しました-異なるスレッドから誤ったCUDA呼び出しのセットを実行するだけで、マシンを繰り返し、即座に再起動できることがわかりました。

Driver APIを介してすべてを移行したので、すべて順調です。

J

20
Jason Dale

注意すべきいくつかの重要な点:

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

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

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

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

4
Eri

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

0
Robert