CUDA 11.1 から, (ひっそりと) PTX compiler API が追加されました.
PTX のコンパイルをドライバ側ではなく, Toolkit ライブラリ側で行います.
(ドライバ側でコンパイルだと, 古いドライバだと最新の PTX 機能が使えないなどがあるとドキュメントにあります)
PTX compiler API 自体は static library です. 自前アプリに組み込んで配布が可能となります.
コンパイルされた elf バイナリが取得できるので, 自前でキャッシュ関連の実装が必要ですが, PTX JIT compile 結果のキャッシュができるようになります.
使い方
CUDA Toolkit の samples にサンプルコードがなくてつらいです
API はそんなに多くないので, ドキュメントにあるサンプルコードで事足りるでしょうか.
とりあえずサンプルコードが動くのを確認しました.
PTX Compiler API 自体は CUDA API に依存していないので, PTX compile 自体だけなら cuda 関連のヘッダのインクルードやライブラリのリンクは不要です.
Linux の場合, 最低限 pthreads と libm のリンクが必要です.
再配布可能なライセンス
にあるように, libnvptxcompiler_static.a
は, (自身のアプリに組み込んで)再配布可能になっています.
(cudart.dll など動的ライブラリも実は再配布可能なのですね)
CUDA -> PTX の作成
PTX compile をクライアント側で処理するなら, cu -> PTX も NVRTC や nvcc とかではなく自前で JIT コンパイルしたくなりますね.
Clang で CUDA コードを NVPTX に変換するメモ
https://qiita.com/syoyo/items/4e60543aded0210fde49
libclang を使えば, libcuda 非依存で, 自前アプリに .cu -> .ptx の JIT コンパイル機能も追加できるはずです!
libClang/LLVM で C++ コードの JIT コンパイルを行う.
https://qiita.com/syoyo/items/486ce53a0dd7a8c73d71
CUDA C++ STL?
libcxx をベースにした CUDA 用の C++ Standard Library があります.
が, 現状提供されているのは atomic とかだけです.
std::vector
とかのコンテナは提供されていないため, C++ STL 相当すべてが使えるわけではないことに注意ください.