在执行CUDA设备代码的同时,在同一线程中运行主机代码

4
有没有办法在执行CUDA设备函数的同时运行主机代码?由于CUDA运行时必须等到设备函数完成,我想知道是否有可能在此期间调用提供的主机函数委托。
类似于这样的东西: enter image description here 对我来说,在<>调用之前启动线程不是同一件事情[开销,……]。

CUDA设备代码始终是异步的。一些运行时函数是同步的,例如CudaDeviceSync或device memcopy。 - Ivan Solntsev
@IvanSolntsev:你的意思是我需要在<<<call>>>之后和CudaDeviceSync()之前调用我的线程函数,然后我就能实现想要的效果了吗? - Peter VARGA
基本上 - 是的。不确定当设备线程在调用之前完成时,CudaDeviceSync会表现出何种行为。您应该参考CUDA编程指南。 - Ivan Solntsev
1个回答

4
CUDA内核调用是异步的。这意味着在内核实际开始执行之前,控制权将返回到进行内核调用的主机线程。因此,您可以通过将主机代码放置在内核调用之后(并在任何其他CUDA API调用(如cudaDeviceSynchronize()cudaMemcpy())之前)来与内核同时运行主机代码。放置在那里的主机代码将与内核并发运行,只要内核执行(以及主机代码执行)。如果您需要从设备(内核)获取结果,则非异步CUDA API调用(例如cudaDeviceSynchronize()cudaMemcpy())将强制主机代码(线程)等待先前发出的CUDA活动(内核)完成。您可能希望阅读编程指南中关于异步并发执行的内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接