我使用(CUDA C++)asyncEngineCount = 1的GPU GeForce GTX 460SE的推力。據我所知,我可以將傳輸數據重疊到GPU /執行單個內核的方式之一。但是當我使用:從GPU轉移,轉移到GPU,執行內核:如何重疊傳輸數據與執行Thrust算法?
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的視覺探查見執行。也許這是因爲Thrust算法在零流中執行,不能與任何東西重疊?以及如何解決這個問題?
但是後來我不得不改變Thrust的每個下一個版本:) 據我所知,主要問題是算法(Thrust)運行在零流。在這種情況下,如果我不更改Thrust,是不是對我有幫助?如果我在單獨的CPU線程中並行啓動異步處理(cudaMemcpyAsync)數據? – Alex 2012-08-20 22:11:54
不可以。多個主機線程不能同時共享上下文。正如我已經說過的,推力不支持這一點,並且你無法編寫自己的代碼(等價地改變自己的推力)就無法繞過這個限制。推力是爲方便和易用而設計的,而不是最終的性能。 – talonmies 2012-08-21 06:19:42