如何解决如何使用 CUDA/Thrust 将阵列的不相交子集从设备异步复制到主机?
我不确定这是否可能以异步方式实现,但我想做的是以下内容。假设我在设备上有以下数组:
d_arr = [0,1,2,3,4,5,6,7,8,9]
还假设我有一个大小为 h_arr
的主机数组 3
。最后,假设我有以下指针数组:
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,8]
我想异步执行此操作,因为我主要关心的是速度,因为我有一个驱动程序方法,它在循环中运行内核,然后在每轮结束时复制回数据。
解决方法
如果 p_arr
的元素之间的步幅是恒定的,那么在 a single operation 中使用 cudaMemcpy2DAsync
是可能的。
对于不同的步幅,它在单个操作中不可能。此外,单一操作方法(具有恒定步幅)不一定是最快的方法(cudaMemcpy2DAsync
方法不一定接近预期的总线传输速度)。对于最快的方法,加上处理要复制的元素之间不同步幅的能力,通常的建议是将其分为两个步骤。
- 执行类似
thrust::gather
(或带有置换迭代器的thrust::copy
)的操作以收集所有要复制到连续的临时设备缓冲区的元素 - 然后使用
cudaMemcpyAsync
将该缓冲区复制到主机。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。