8

この質問は、cuda ストリームを使用して多くのカーネルを実行することに関連しています

CUDA には、多くの同期コマンド cudaStreamSynchronize、CudaDeviceSynchronize、cudaThreadSynchronize、およびストリームが空かどうかを確認するための cudaStreamQuery があります。

プロファイラーを使用しているときに、これらの同期コマンドがプログラムに大きな遅延をもたらすことに気付きました。もちろん、できるだけ少ない同期コマンドを使用する以外に、このレイテンシを短縮する方法を誰かが知っているかどうか疑問に思っていました.

また、最も効率的な同期方法を判断する数値はありますか。つまり、アプリケーションで 3 つのストリームが使用されていると見なされ、2 つの cudaStreamSync または 1 つの cudaDeviceSync のみを使用して 4 番目のストリームを起動するには、そのうちの 2 つを完了する必要があります。

4

1 に答える 1

11

同期方法の主な違いは、「ポーリング」と「ブロッキング」です。

「ポーリング」は、ドライバーが GPU を待機するデフォルトのメカニズムです。これは、32 ビットのメモリ位置が GPU によって書き込まれた特定の値に到達するのを待機します。待機が解決された後、より迅速に待機を返す可能性がありますが、待機中は、そのメモリ位置を見て CPU コアを焼き尽くします。

「ブロッキング」は、 で呼び出すか、 でcudaSetDeviceFlags()呼び出すことによって要求できます。ブロッキング待機により、ドライバーは DMA コマンド バッファーにコマンドを挿入し、バッファー内の先行するすべてのコマンドが実行されたときに割り込みを通知します。その後、ドライバーは割り込みを Windows イベントまたは Linux ファイル ハンドルにマップできるため、デフォルトのポーリング方法のように、常に CPU を消費することなく同期コマンドを待機させることができます。cudaDeviceScheduleBlockingSynccudaEventCreate()cudaEventBlockingSync

クエリは基本的に、ポーリング待機に使用される 32 ビット メモリ位置の手動チェックです。そのため、ほとんどの場合、非常に安価です。ただし、ECC が有効になっている場合、クエリはカーネル モードに移行して、ECC エラーがあるかどうかを確認します。Windows では、保留中のコマンドはすべてドライバーにフラッシュされます (これにはカーネル サンクが必要です)。

于 2012-08-15T01:26:57.197 に答える