如何使用 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
方法不一定接近预期的总线传输速度)。对于最快的方法,加上处理要复制的元素之间的不同步幅的能力,通常的建议是将其分成两步。
- 做类似
thrust::gather
(或 thrust::copy
使用置换迭代器)的操作来收集所有要复制到连续的临时设备缓冲区中的元素
- 然后使用
cudaMemcpyAsync
将该缓冲区复制到主机。
我不确定这是否可能以异步方式进行,但我想做的是以下内容。假设我在设备上有以下数组:
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
方法不一定接近预期的总线传输速度)。对于最快的方法,加上处理要复制的元素之间的不同步幅的能力,通常的建议是将其分成两步。
- 做类似
thrust::gather
(或thrust::copy
使用置换迭代器)的操作来收集所有要复制到连续的临时设备缓冲区中的元素 - 然后使用
cudaMemcpyAsync
将该缓冲区复制到主机。