【发布时间】:2013-04-10 05:18:01
【问题描述】:
我的项目将有多个线程,每个线程在不同的 cudaStreams 上发布内核执行。其他一些线程将消耗将存储在队列中的结果这里的一些伪代码:
while(true) {
cudaMemcpyAsync(d_mem, h_mem, some_stream)
kernel_launch(some_stream)
cudaMemcpyAsync(h_queue_results[i++], d_result, some_stream)
}
在第一个 cudaMemcpyAsync 返回后重用 h_mem 是否安全?还是应该使用 N 个主机缓冲区来发出 gpu 计算?
如何知道h_mem什么时候可以重用?我应该使用 cudaevents 进行一些同步吗?
顺便说一句。 h_mem 是主机固定的。如果它是可分页的,我可以直接重用 h_mem 吗?从我在这里读到的内容看来,我可以在 memcpyasync 返回后立即重用,对吗?
异步
对于从可分页主机内存到设备内存的传输,主机内存 立即复制到暂存缓冲区(无设备同步 被执行)。一旦可分页缓冲区具有,该函数将返回 已复制到暂存内存。 DMA传输到最终 目的地可能尚未完成。用于固定主机之间的传输 内存和设备内存,功能完全异步。为了 从设备内存传输到可分页主机内存,函数 只有在复制完成后才会返回。对于所有其他转移, 该函数是完全异步的。如果可分页内存必须首先 暂存到固定内存,这将使用异步处理 工作线程。对于从任何主机内存到任何主机内存的传输, 该函数与主机完全同步。
谢谢!
【问题讨论】:
标签: cuda