2012-08-16 56 views
2

我使用(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算法在零流中執行,不能與任何東西重疊?以及如何解決這個問題?

回答

3

Thrust目前沒有控制其算法的執行流的機制,因此您無法按照當前代碼庫的要求進行操作。曾有報道說用戶修改推力碼基礎以接受流(例如this google groups thread),但根據您使用的算法和結構的複雜程度,這可能會或可能不可行。一些算法也有內部數據傳輸,您需要非常小心,在從串行移動到異步執行時不會破壞事物。

+0

但是後來我不得不改變Thrust的每個下一個版本:) 據我所知,主要問題是算法(Thrust)運行在零流。在這種情況下,如果我不更改Thrust,是不是對我有幫助?如果我在單獨的CPU線程中並行啓動異步處理(cudaMemcpyAsync)數據? – Alex 2012-08-20 22:11:54

+0

不可以。多個主機線程不能同時共享上下文。正如我已經說過的,推力不支持這一點,並且你無法編寫自己的代碼(等價地改變自己的推力)就無法繞過這個限制。推力是爲方便和易用而設計的,而不是最終的性能。 – talonmies 2012-08-21 06:19:42

4

對於任何人還在尋找,我相信現在推力supports streams.

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

編輯:我覺得語法現在已經在最新提交變更爲thrust::cuda::par.on(s)