🦁

CUDA PTX Compiler API では sm version を実行環境に合わせないと実行できない

に公開

https://qiita.com/syoyo/items/cfaf0f7dd20b67cc734e

PTX Compiler API で, ptx を gpu bin(elf 形式)にホスト側(ドライバではなくユーザーの app 側)でコンパイルできますが, コンパイルしたコードを実行するとき, sm version は実行する GPU のバージョン(アーキ)に合わせないとダメでした.

https://docs.nvidia.com/cuda/ptx-compiler-api/index.html#basic-usage

バージョンが合わないと, コンパイルしたバイナリを cuModuleLoadDataEx でロードするときに CUDA_ERROR_INVALID_SOURCE エラーが出ます.

https://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__MODULE.html#group__CUDA__MODULE_1g04ce266ce03720f479eab76136b90c0b

ドキュメントには CUDA_ERROR_INVALID_SOURCE が帰り値には列挙されていないのでややこしい.

--gpu-name 複数指定はできず, --gpu-name=sm_70,sm_80 みたいにコンマ区切りで複数も指定できないので, fat binary(複数アーキ混在) な elf は直接には作れない模様.

PTX compiler API で JIT compile する場合, --gpu=name は実行 GPU のアーキを指定してあげる必要があります.

cubin のバイナリ(assembly)は上位互換あるのかと思っていましたが(sm_70(Volta)でコンパイルしたコードは sm_80(Ampere)でも動く), そうではありませんでした.

Discussion