2

asyncEngineCount = 1 で GPU GeForce GTX 460SE に (CUDA C++) Thrust を使用します。私が知っているように、GPU との間でデータ転送をオーバーラップさせ、単一のカーネルを実行することができます。しかし、私が使用するとき:

cudaStream_t Stream1, Stream2;
cudaStreamCreate(&Stream1);
cudaStreamCreate(&Stream2);
cudaMemcpyAsync(thrust::raw_pointer_cast(d_vec_src.data()), host_ptr1, test_size, cudaMemcpyHostToDevice, Stream1);
cudaMemcpyAsync(host_ptr2, thrust::raw_pointer_cast(d_vec_dst.data()), test_size, cudaMemcpyDeviceToHost, Stream2);
thrust::sort(d_vec_dst.begin(), d_vec_dst.end());
cudaThreadSynchronize();

nVidia Visual Profiler で見られるように、GPU からの転送、GPU への転送、カーネルの実行など、順次実行されます。おそらくこれは、何もオーバーラップできないゼロ 0 ストリームで実行されるスラスト アルゴリズムが原因でしょうか? そして、この問題をどのように解決しますか?

4

2 に答える 2

4

まだ探している人にとっては、Thrustがストリームをサポートするようになったと思います。

cudaStream_t s;
cudaStreamCreate(&s);
thrust::sort(thrust::cuda::par(s), keys.begin(), keys.end());
cudaStreamSynchronize(s);
cudaStreamDestroy(s);

thrust::cuda::par.on(s)編集:最新のコミットで構文が変更されたと思います。

于 2014-07-03T02:03:17.913 に答える
3

Thrust には現在、そのアルゴリズムの実行ストリームを制御するメカニズムがないため、現在のコード ベースでは求めていることを実行できません。スラスト コード ベースを変更してストリームを受け入れるユーザーの報告があります (たとえば、この google グループのスレッド) が、使用するアルゴリズムの複雑さとその構造に応じて実行可能である場合とそうでない場合があります。一部のアルゴリズムには内部データ転送もあり、シリアルから非同期実行に移行するときに問題が発生しないように十分に注意する必要があります。

于 2012-08-16T15:47:29.527 に答える