如何通过执行Thrust算法重叠传输数据?

时间:2012-08-16 14:07:09

标签: parallel-processing cuda gpgpu thrust

我使用(CUDA C ++)推动GPU GeForce GTX 460SE与asyncEngineCount = 1。 据我所知,我可以将传输数据重叠到GPU之间或从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();

和Thrust算法,它按照我在nVidia Visual Profiler中看到的顺序执行:从GPU传输,传输到GPU,执行内核。也许这是因为Thrust算法在零0流中执行,不能与任何东西重叠?如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

对于仍在搜索的人,我相信Thrust现在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)

答案 1 :(得分:3)

Thrust目前没有一种机制来控制其算法的执行流,因此您无法使用当前代码库执行您所要求的操作。有报道称用户修改推力代码库以接受流(例如this google groups thread),但根据您使用的算法的复杂性及其结构,可能存在也可能不存在。有些算法也有内部数据传输,在从串行执行到异步执行时,你需要非常小心不要破坏。