我使用(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