4

いくつかのサブルーチンを持つ 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 の両方を無効にしたプログラム コードはストリーミング マルチプロセッサの命令キャッシュに収まり、他のバージョンは大きすぎます。これにより、グローバル メモリ アクセスが発生する可能性があり、より多くのプログラム コードをロードできるようになり、レイテンシがこの不一致を引き起こします。残念ながら、命令キャッシュ サイズに関する情報は見つかりませんでした。

これらの結果の解釈を手伝ってくれる人はいますか?

4

1 に答える 1

0

あなたの結果につながるいくつかのことがあります。次のものが含まれる場合があります。

  • A & B の欠如は、残りのコードの追加の最適化につながります。結果のコードは短くはないかもしれませんが、それでも実行速度は速くなる可能性があります。

  • オプティマイザーは、A の特定のコードが B にも存在することを検出しました (A と B はまだ独立している可能性があります)。その結果、A と B の両方を使用すると、A と B を別々に使用するよりもプログラムの速度が遅くなります。

  • A または B のみ (またはどちらでもない) を使用すると、メモリ アクセス パターンが改善され、残りのコードでデータを読み取るときにキャッシュ ヒットが増加します。(プログラム コードではなく、データについて話している)

  • A と B がないと占有率が向上し、より多くのスレッドを同時に実行できるようになります。

命令キャッシュが問題であるとは思えません。グローバル メモリの読み取りが必要な場合でも、warp は常に 1 つの命令しか必要としないため、「位置ずれ」することはありません。私の推測では、彼らは命令のために専用のハードウェアを使用していると思います。

于 2012-12-05T22:20:21.877 に答える