1

私は cuda と freeglut を含むプロジェクトに取り組んでおり、可能な限りすべてのジュースを取り出そうとしています。

いくつかの計算を行ってから描画するループがあります。nsight トレースから、毎秒約 100 ~ 200 ミリ秒、何も行われていないように見えることに気付きました。これはまったく受け入れられません。80% ~ 90% の速度しか出せない原因となっているこの失速をなくしたいのが理想です。

失速は、秒の最初のドットでは発生しませんが、非常に規則的な間隔で発生します。

私の処理ループは次のようになります

cudaDeviceSynchronize();

kernel_call_1( ... , stream0);

if(T != 0) cudaStreamWaitEvent(stream1, event0, 0);
     cudaMemcpyAsync( ... ,cudaMemcpyDeviceToHost,stream1);


kernel_call_2( ... , stream0);
cudaEventRecord(event0, stream0);


drawGL( ... );

OpenGL は CUDA とは別のカードで行われ、CUDA の出力はその memcpy でホストに送られ、glTexSubImage3D で OpenGL にプッシュされます。

CUDA、OpenGL、または FreeGLUT は、ストールの原因となる可能性があることを背後で行っていますか?

編集: 私が気付いた他の何か、NSight は cpu フレームと gpu フレームを区別します。CPU フレームを見ると、ゆっくりと GPU との同期が失われているように見えます。これは、単一の CPU フレームが長く実行されるストールまで発生しますが、GPU フレームは同じ速度で進み続け、同期を取り戻します。OpenGL は背後で同期を行っていますか? この動作を制御する方法はありますか?

編集: これは NSight トレースのスクリーン ショットです。 NSight トレース

4

1 に答える 1