2016-11-24 20 views
0

私は簡単な質問があります。私は(単純化)のようなユニークなcuda_streamに関連するメモリのn個のブロックを割り当てています、[それは-_-非常に悪い考えかもしれ]:複数のcuda_streamを1つのcudaカーネルにつける

void *ptr = NULL; 
cudaStream_t stream; 
cudaMallocManaged(&ptr, size); 
cudaStreamAttachMemAsync(stream, ptr); 

後の私のコードで私はこれを6で私のカーネルを呼び出していますメモリブロック(ランダムプロセスで決定)。 cudaランチャーはストリーム引数を1つだけ取ります。

update_gpu<<<256, 256,0,???>>>(block1,block2,block3,block4,block5,block6); 

???ストリームでなければならないが、どちらを通過させるべきか?私は

cudaDeviceSynchronize() 

と同期させることができるが、私はブロック

cudaStreamSynchronize(...) 

の多くを持っているとして、それは、あまりにも多くて、私は私のストリームの5のためにそれを行う必要があり、解決策のように見えますか?

提案がありますか?

最高、

++トン

答えて

1

Attaching memory to a specific streamは、このメモリは、特定のストリーム以外に表示する必要はありませんランタイムを伝える最適化、です。 疑問がある場合は、ストリームにメモリを接続しないでください。すべてのカーネルに表示されます。 ストリームをまったく使用しない(つまり、すべてのカーネルがデフォルトのストリームに起動される)場合、これは特に適切な方法です。

ただし、この最適化を利用したい場合は、カーネルが実行されるまでに、すべての管理メモリがアタッチされていないか、またはカーネルが起動された特定のストリームにアタッチされていなければなりません。

+0

「特定のストリーム以外には見えないようにする必要があります」といっても意味があります。ありがとうございます。 –

関連する問題