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 で (ワープとブロックで) どのように配置されるかは、はるかに顕著な効果をもたらします。