CUDA でラドンのような変換を実装していますが、GeForce TITAN からすべてのパフォーマンスを引き出すことができないようです (編集: どうやらそうです、コメントを参照してください)。これを最適化するために、最小限のデータ転送しか必要としないカーネルを同時に実行することを考えましたが、カーネルを同時に実行することはできません。
典型的なプロファイルの実行は次のようになります。
これは、「並行カーネル サポート」を有効にして、CUDA 5.5 (RC) を使用して sm_35 のコードをコンパイルおよび生成します。オーバーラップは最小限であり、その価値はほとんどありません。
カーネルの同時実行について少し読んで、それを正しくするためにさまざまなことを試しました。
- 異なるストリームでカーネルを起動する
- カーネルの起動をインターリーブします。たとえば、最初に n ストリームを使用してカーネル A を n 回起動し、次に同じ n ストリームを使用してカーネル B を n 回起動します (ただし、これは Kepler では不要になる可能性があります。ハードウェアは、起動された場合でもカーネルを部分的にオーバーラップさせることができました)。非インターリーブ)
- カーネルが同じグローバル メモリを使用していないことを確認します (ただし、それが重要かどうかはわかりません)。
- カーネルが共有メモリを使いすぎないようにします (ローテーション カーネルはまったく使用しません)。
回転カーネルがこれ以上オーバーラップしない理由がわかりません。私はリソースに制約がありますか?もしそうなら、どうすればこれを見つけることができますか? より多様なカーネルを使用すると、もう少し並列化することができます。たとえば、これでは、
しかし、私はそれがもっとうまくいくべきだと思います...
編集:再現できないため20%の数字を削除しましたが、それも間違っているようです