2

我使用 (CUDA C++) Thrust for GPU GeForce GTX 460SE,asyncEngineCount = 1。据我所知,我可以以一种方式重叠传输数据到 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();

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

4

2 回答 2

4

对于仍在搜索的人,我相信 Thrust 现在支持流。

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

编辑:我认为语法现在已更改为thrust::cuda::par.on(s)最新提交。

于 2014-07-03T02:03:17.913 回答
3

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

于 2012-08-16T15:47:29.527 回答