Tesla T10プロセッサ(計算機能1.3)からTesla M2075(計算機能2.0)に書き込んだアルゴリズムを切り替えようとしています。切り替え中、私のアルゴリズムが遅くなるのを見て驚いた。私はそれを分析し、それが新しいマシンでは川が流れていないことが原因であると思われることがわかりました。私のアルゴリズムには、メモリ再編成(CPU上で実行可能)、ホストからデバイスへのメモリコピー、およびデバイス上のカーネル実行の3つの主要タスクが並行して実行できます。以前のカーネルが実行されるまで、CPUの計算を開始する前に、新しいマシンにしかしストリームブロックを CUDAストリームがブロックされている理由を確認する方法
:古いマシン分割でストリームは3つのタスクは次のように(NVidiaのビジュアルプロファイラーからのすべてのスクリーンショット)をオーバーラップすることができここで見られるように、すべてのオレンジ色のブロックは、そのカーネルが完全に異なるストリーム上にあっても、前のカーネルが実行されるまでブロックされるcudaStreamSynchronizeコールです(上の行を見ることができます)。ストリームを最初に実行して正しく並列化するように見えますが、それ以降は問題が始まるので、何かをブロックしていると思って、ストリームの数を増やしてこの結果を得ました。
何らかの理由で最初の4つのストリームだけがブロックされていることがわかります。その後、ストリームが正しく並列化を開始します。最後の試みとして、最初の4つのストリームを1回だけ使用し、その後のストリームを使用するように切り替えることでハックしようとしましたが、まだ動作せず、他のストリームを同時に実行させながら4つのストリームをすべて停止しました:
私はこの問題の原因となる可能性のあるものとそれを診断する方法について考えています。私は自分のコードを徹底的に見てきましたが、間違いかもしれませんが、それはバグだとは思いません。各ストリームは独自のクラスにカプセル化され、そのクラスのメンバである単一のcudaStream_tへの参照しか持たないので、別のストリームを参照してブロックする方法がわかりません。
私が気付いていないバージョン1.3と2.0との間でストリームが動作する方法にいくつかの変更がありますか?共有メモリが解放されず、それを待たなければならないものかもしれませんか?どのようにこの問題を診断するためのアイデアは歓迎、ありがとうございます。
あなたの問題がNVIDIAフォーラムの次のスレッド(https://devtalk.nvidia)で最近議論されたものと同じであるかどうかは疑問です。com/default/topic/545476/cuda-programming-and-performance/cuda-stream-performance /オプション 'conckerneltrace'をプロファイラの設定に追加する解決策がありました。 – njuffa
windowsまたはlinux?どちらのドライババージョンを使用していますか?あなたのカーネルの起動パラメータは何ですか?あなたは何らかの再生器を投稿できますか? –
NVIDIA Visual Profiler(CUDA 5.0および5.5)には、「同時カーネルプロファイリングを有効にする」オプションもあります。私はこれがCLIオプション 'conckerneltrace'と同じ結果を達成すると思います。それには、CC> = 2.0デバイスが必要であることに注意してください。 – BenC