2011-07-07 15 views
2

解決策が見つかるまで、カーネルを何回か起動しました。解は少なくとも1つのブロックによって見出される。
したがって、ブロックが解決策を見つけると、解決策が見つかったことをCPUに知らせる必要があります。したがって、CPUはこのブロックによって提供される解決策を出力します。
ので、私が現在やっていることは、次のとおりです。は私のケースでは良いcudaHostAllocを使用しています

__global__ kernel(int sol) 
{ 
    //do some computations 
    if(the block found a solution) 
     sol = blockId.x //atomically 
} 

私は戻ってホストメモリにゾルをコピーし、その値をチェックし、カーネルを呼び出すたびに。たとえば3に設定されている場合、私はblockid 3が解決策を見つけたので、解決策のインデックスがどこにあるかを知っているので、解決策をホストにコピーし直します。
この場合、cudaHostAllocを使用する方がよいでしょうか?すべてのカーネル呼び出しで単一の整数の値をコピーすると、プログラムが遅くなります。

答えて

1

GPUからCPUにコピーを発行して完了するのを待つと、プログラムが遅くなるビット。 1バイトまたは1KBを送信することを選択した場合は、それほど大きな違いはありません。この場合、帯域幅は問題ではなく、待ち時間です。

しかし、カーネルを起動すると時間がかかることもあります。あなたのアルゴリズムの「肉」がカーネル自体にある場合、私はその単一の小さな転送にあまり時間を費やしません。

ドゥ・ノート、あなたが代わりにcudaMemcpyを使用しての、マップされたメモリを使用することを選択した場合は、明示的に読む前に(cudaMemcpyで暗黙のバリアではなく)cudaDeviceSynchronise(または古いCUDAとcudaThreadSynchronise)障壁を配置する必要があります状態。さもなければ、あなたのホストコードは、カーネルがそれを上書きする前に、あなたの固定されたメモリに保存されている古い値を読みとるかもしれません。

+0

CUDA 4.0では 'cudaDeviceSynchronize()'、 'cudaThreadSynchronize()'は非推奨です。 – harrism

+0

OK、固定。ありがとう! – CygnusX1

+0

@harrism cudaDeviceSynchronize()とcudaThreadSynchronize()の違いは何ですか?彼らは同じことをするつもりだと思いますが、名前を変えるのはなぜですか? –

関連する問題