微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何使用 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 方法不一定接近预期的总线传输速度)。对于最快的方法,加上处理要复制的元素之间不同步幅的能力,通常的建议是将其分为两个步骤。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。