我有一种方法可以将一些数据复制到设备,在各自的流上调用多个内核,然后调用cudaMemcpyAsync不同的流,以便它们在各自的内核之后运行。
既然我已经读过这两个内核并且cudaMemcpyAsync都启动并与主机代码并行运行,那么在这些完成之前我调用它们的函数是否可以作为回报,或者它只会与同一函数中的主机代码并行运行?
调用 kernel/cudaMemcpy 的主机方法可能会在 kernel/memcpy 完成之前返回吗?
是的,可能。如果您所做的只是调用内核和cudaMemcpyAsync操作,则调用它们的 cpu 函数可能会在操作完成之前完成/返回(即使这是您的main例行程序!)
这些操作都是异步的,这意味着它们不会阻塞调用它们的 CPU 线程。
即使您有很多 CPU 代码在内核调用和cudaMemcpyAsync调用之后运行,也不能保证 GPU 活动会完成(甚至开始!),除非您使用一些将主机线程与设备活动同步的函数,例如普通cudaMemcpy电话或cudaDeviceSynchronize()电话cudaStreamSynchronize()或其他类似电话。
这不受 CPU/主机代码的功能结构影响。