いくつかのサブルーチンを持つ CUDA プログラムを作成しました。サブルーチン A を無効にすると、実行時間が a だけ改善されます。サブルーチン B を無効にすると、ランタイムが量 b だけ改善されます。サブルーチン A と B を無効にすると、実行時間が c > a + b だけ改善されます。両方のサブルーチンは互いに完全に独立しています。
この次の部分は、これを分析する単純なアプローチかもしれませんが、ここで私が行ったことを示します。コードの各バージョンをコンパイルし、各バイナリに対してcuobjdump --dump-sassを実行しました。結果の出力は、完全なバイナリで約 1350 行、1 つのサブルーチンが無効になっている各バイナリで約 1100 行でした。両方のサブルーチンを無効にすると、850 行になりました。最初の 3 つの行には 3.1 マイクロ秒、両方のサブルーチンを無効にするには 2.4 マイクロ秒が必要なようです。
A と B には複雑なものが含まれていないか、残りのコードよりもメモリを集中的に使用していないため、これは、常に集中的な操作をコメントアウトし、単純な操作をアクティブのままにしておくことが原因ではないと思います。私の推測では、A と B の両方を無効にしたプログラム コードはストリーミング マルチプロセッサの命令キャッシュに収まり、他のバージョンは大きすぎます。これにより、グローバル メモリ アクセスが発生する可能性があり、より多くのプログラム コードをロードできるようになり、レイテンシがこの不一致を引き起こします。残念ながら、命令キャッシュ サイズに関する情報は見つかりませんでした。
これらの結果の解釈を手伝ってくれる人はいますか?