如何使用 CUDA/Thrust 将数组的不相交子集从设备异步复制到主机?

How to asynchronously copy a disjoint subset of an array from device to host with CUDA/Thrust?

我不确定这是否可能以异步方式进行,但我想做的是以下内容。假设我在设备上有以下数组:

d_arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

还假设我有一个大小为 3 的主机数组 h_arr。最后,假设我有以下指针数组:

p_arr = [&d_arr[0], &d_arr[4], &d_arr[8]]

我想调用虚函数

cudaMemcpyAsyncDisjoint(&d_arr[0], &h_arr[0], &p_arr[0], 3)

然后填充数组 h_arr 使其变为

h_arr = [0, 4, 8]

我想异步执行此操作,因为我主要关心的是速度,因为我有一个驱动程序方法,它循环运行内核,然后在每一轮结束时复制回数据。

如果 p_arr 的元素之间的步幅是恒定的,那么这在 cudaMemcpy2DAsync 中是可能的。

对于不同的步幅,其不可能在单个操作中。此外,单一操作方法(步幅恒定)不一定是最快的方法(cudaMemcpy2DAsync 方法不一定接近预期的总线传输速度)。对于最快的方法,加上处理要复制的元素之间的不同步幅的能力,通常的建议是将其分成两步。

  1. 做类似 thrust::gather(或 thrust::copy 使用置换迭代器)的操作来收集所有要复制到连续的临时设备缓冲区中的元素
  2. 然后使用cudaMemcpyAsync将该缓冲区复制到主机。