如何重叠传输数据与执行Thrust算法?
问题描述:
我使用(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目前没有控制其算法的执行流的机制,因此您无法按照当前代码库的要求进行操作。曾有报道说用户修改推力码基础以接受流(例如this google groups thread),但根据您使用的算法和结构的复杂程度,这可能会或可能不可行。一些算法也有内部数据传输,您需要非常小心,在从串行移动到异步执行时不会破坏事物。
答
对于任何人还在寻找,我相信现在推力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)
。
但是后来我不得不改变Thrust的每个下一个版本:) 据我所知,主要问题是算法(Thrust)运行在零流。在这种情况下,如果我不更改Thrust,是不是对我有帮助?如果我在单独的CPU线程中并行启动异步处理(cudaMemcpyAsync)数据? – Alex 2012-08-20 22:11:54
不可以。多个主机线程不能同时共享上下文。正如我已经说过的,推力不支持这一点,并且你无法编写自己的代码(等价地改变自己的推力)就无法绕过这个限制。推力是为方便和易用而设计的,而不是最终的性能。 – talonmies 2012-08-21 06:19:42