Cuda Runtime API で非常に奇妙な問題が発生しています。、などcudaMallocHost()
の関数の呼び出しは、カーネルが GPU での実行を終了したときにのみ実行されるようです。このカーネルはすべて、フラグで作成されたストリームで起動されます。何が問題ですか?他のフラグをどこかに立てる必要がありますか?cudaEventCreate()
cudaFree()
cudaStreamNonBlocking
1 に答える
非同期にすることもできますが、そうでなくても不思議ではありません。
に関してはcudaMallocHost()
、ホスト メモリを GPU にマップする必要があります。事前に割り当てられたプールから割り当てを満たすことができない場合は、GPU のページ テーブルを編集する必要があります。実行中のカーネルのページ テーブルを編集できないという制限がドライバーにあったとしても、まったく驚かないでしょう。(特に、ページ テーブルの編集はカーネル モード ドライバー コードで行う必要があるためです。)
に関してはcudaEventCreate()
、これらの割り当ては通常、事前に割り当てられたプールから満たすことができるため、実際には非同期である必要があります。主な障害は、動作を変更すると、現在の同期動作に依存している既存のアプリケーションが壊れてしまうことです。
オブジェクトを非同期的に解放するには、GPU に送信されたコマンド バッファーで参照されているオブジェクトをドライバーが追跡し、GPU がそれらの処理を完了するまで実際の解放操作を延期する必要があります。実行可能ですが、NVIDIA がその作業を行ったかどうかはわかりません。
の場合cudaFree()
、CUDA イベントの場合のように参照を追跡することはできません (実行中のカーネルが読み取って追跡するためにポインターを格納できるため)。そのため、割り当てを解除してマップを解除する必要がある大きな仮想アドレス範囲の場合、保留中のすべての GPU 操作が実行されるまで解放を延期する必要があります。繰り返しますが、実行可能ですが、NVIDIA が作業を行ったかどうかはわかりません。
NVIDIA は一般的に、開発者がこれらのエントリ ポイントでの非同期性の欠如を回避することを期待していると思います。