2

CUDA でラドンのような変換を実装していますが、GeForce TITAN からすべてのパフォーマンスを引き出すことができないようです (編集: どうやらそうです、コメントを参照してください)。これを最適化するために、最小限のデータ転送しか必要としないカーネルを同時に実行することを考えましたが、カーネルを同時に実行することはできません。

典型的なプロファイルの実行は次のようになります。 ここに画像の説明を入力

これは、「並行カーネル サポート」を有効にして、CUDA 5.5 (RC) を使用して sm_35 のコードをコンパイルおよび生成します。オーバーラップは最小限であり、その価値はほとんどありません。

カーネルの同時実行について少し読んで、それを正しくするためにさまざまなことを試しました。

  • 異なるストリームでカーネルを起動する
  • カーネルの起動をインターリーブします。たとえば、最初に n ストリームを使用してカーネル A を n 回起動し、次に同じ n ストリームを使用してカーネル B を n 回起動します (ただし、これは Kepler では不要になる可能性があります。ハードウェアは、起動された場合でもカーネルを部分的にオーバーラップさせることができました)。非インターリーブ)
  • カーネルが同じグローバル メモリを使用していないことを確認します (ただし、それが重要かどうかはわかりません)。
  • カーネルが共有メモリを使いすぎないようにします (ローテーション カーネルはまったく使用しません)。

回転カーネルがこれ以上オーバーラップしない理由がわかりません。私はリソースに制約がありますか?もしそうなら、どうすればこれを見つけることができますか? より多様なカーネルを使用すると、もう少し並列化することができます。たとえば、これでは、

ここに画像の説明を入力

しかし、私はそれがもっとうまくいくべきだと思います...

編集:再現できないため20%の数字を削除しましたが、それも間違っているようです

4

0 に答える 0