2012-08-16 89 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)

相关问题