カーネルをさらに最適化するために、カーネルのPTXコードを読むことをお勧めしますか?
一例:自動ループ展開が機能したかどうかをPTXコードから確認できることを読みました。そうでない場合は、カーネルコードでループを手動で展開する必要があります。
- PTXコードの他のユースケースはありますか?
- PTXコードを調べますか?
- CUDAがカーネル用に生成したPTXコードを読み取る方法はどこで確認できますか?
カーネルをさらに最適化するために、カーネルのPTXコードを読むことをお勧めしますか?
一例:自動ループ展開が機能したかどうかをPTXコードから確認できることを読みました。そうでない場合は、カーネルコードでループを手動で展開する必要があります。
PTXについて最初に指摘するのは、PTXは、仮想マシンアセンブリ言語であるGPUで実行されるコードの中間表現にすぎないということです。ptxas
PTXは、コンパイル時または実行時のドライバーによって、ターゲットマシンコードにアセンブルされます。したがって、PTXを見るときは、コンパイラが出力したものを確認していますが、GPUが実際に実行する内容は確認していません。独自のPTXコードを最初から作成することも(これはCUDAでサポートされる唯一のJITコンパイルモデルです)、またはCUDA Cコードのインラインアセンブラセクションの一部として作成することもできます(後者はCUDA 4.0以降正式にサポートされていますが、 "非公式に」それよりはるかに長い間サポートされています)。CUDAには、ツールキットを備えたPTX言語の完全なガイドが常に付属しており、完全に文書化されています。オセロットプロジェクトこのドキュメントを使用して、独自のPTXクロスコンパイラを実装しました。これにより、CUDAコードを他のハードウェア(最初はx86プロセッサ、最近ではAMD GPU )でネイティブに実行できます。
GPUが実際に実行されているもの(コンパイラーが出力しているものではなく)を確認したい場合、NVIDIAは、FermiGPUcudaobjdump
用にコンパイルされたコードで実際のマシンコードセグメントを表示できると呼ばれるバイナリ逆アセンブラーツールを提供します。decuda
G80およびG90GPUで機能する、と呼ばれる古い非公式のツールがありました。
そうは言っても、PTX出力から学ぶべきことはたくさんあります。特に、コンパイラーが最適化をどのように適用しているか、特定のC構造を実装するためにどの命令を発行しているかについてです。NVIDIA CUDAツールキットのすべてのバージョンには、PTX言語のガイドnvcc
とドキュメントが付属しています。両方のドキュメントには、CUDA C / C ++カーネルコードをPTXにコンパイルする方法を学び、PTX命令が何をするかを理解するための情報がたくさん含まれています。