質問

CUDAアプリケーションを作成する場合、この画像に示されているように、ドライバーレベルまたはランタイムレベルで作業できます(ライブラリは高度な数学のためのCUFFTおよびCUBLASです):

 CUDAレイヤーモデル
(ソース: 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ベータ版(またはそれ以降)のドキュメントをご覧ください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top