CUDA 5.5の新機能(2): CUDA Runtimeの静的リンク

出典: トータル・ディスクロージャ・サイト(事実をありのままに)

CUDA 5.5 RCの検証第2弾、CUDA Runtimeの静的リンクについて。

CUDA Runtimeとは

大雑把に「CUDA」と理解されているAPIには、実は2層のレイヤーが存在する。関数名がcuda~となっているのが特徴のRuntime APIと、cu~となっているのが特徴のDriver APIとの、2系統のAPIである。それぞれの特徴を簡潔に記すと:

Runtime API
.cuファイルのホスト側コードの言語拡張と親和性が高いAPI。たとえば、Runtime APIで確保したデバイスメモリは、そのまま<<<>>>記法で実行するKernelの引数として引き渡すことができる。CUDA Toolkit添付の共有ライブラリファイル(再配布はライセンスで認められている)に実装が含まれているが、nvccコマンドはこのライブラリを自動的にリンクするため、再配布を考えなければ、このライブラリのリンクを考えずに開発が行える(同様に、Runtime APIに必要なヘッダファイルも自動的にインクルードする)。
Driver API
プログラマが管理すべきリソースが多い反面、Runtime APIに比べて柔軟な処理が行えるAPI。Runtime APIも内部ではDriver APIを利用している。C言語ベースで実装されているため、CUDAが前提としないコンパイラを利用する場合においても、C++ベースのRuntime APIに比べて相性問題が発生しにくいというメリットも在る。実装はNVIDIAのGPUドライバのバイナリに含まれていて、ドライバがインストールされていれば、Toolkitやライブラリの再配布を考えずにアプリケーションを配置できる。

というものである。多くの場合、Runtime APIで開発するのが生産性に富む選択となるだろうが、ライブラリの再配布に注意する必要があるのが難点となっていた。

CUDA Runtimeの静的リンク

CUDA 5.5 RCには、従来のRuntime APIの共有ライブラリ実装だけでなく、Runtime API実装を静的リンクするためのライブラリファイルも含まれている。そして、特別なオプションを指定せずにnvccコマンドでRuntime APIを使ったプログラムをコンパイルすると、静的リンクとしてRuntime APIがバイナリに埋め込まれる。こうして生成されたバイナリは、ライブラリの再配布を考えることなく実動環境に配置できる。

CUDA 5.5 RCであえてRuntime APIを動的リンクする場合は、--cudart=sharedのオプションを指定する。また、プログラムをライブラリファイルとして出力したりする場合には、この段階で静的リンクが行われると最終的なリンク工程でシンボルの衝突を起こしてしまうが、--cudart=noneを指定するとRuntime APIのリンクの作業そのものが行われず、この問題を避けるために使える。

なお、今回のCUDA 5.5 RCで静的なライブラリファイルが提供されているのは、このRuntime APIだけの模様である。CUBLASCUFFTなどの各種Toolkit付属ライブラリも同様の問題を抱えているのだが、今回はこちらの解決は見送られているようである。


この記事へのコメントをお寄せください

  • サイトへの書き込みに差し支えございましたら トータルディスクロージャーサイトサポート係へメールをお送りください
  • トータル・ディスクロージャ・サイトに投稿された文章と画像は、すべてその著作権がHPCシステムズ株式会社に帰属し、HPCシステムズ株式会社が著作権を所有することに同意してください。
  • あなたの文章が他人によって自由に編集、配布されることを望まない場合は、投稿を控えてください。
  • コメントを書き込む場合は名前にひらがなを織り交ぜてください。
  • あなたの投稿する文章と画像はあなた自身によって書かれたものであるか、パブリック・ドメインかそれに類する自由なリソースからの複製であることを約束してください。あなたが著作権を保持していない作品を許諾なしに投稿してはいけません!

<comments hideform="false" />


Comments

ノート:CUDA 5.5の新機能(2): CUDA Runtimeの静的リンク

個人用ツール