我有一个方法可以将一些数据复制到设备上,每个都在自己的流上调用多个内核,然后为不同的流调用cudaMemcpyAsync
,以便它们在各自的内核之后运行。
由于我已经读过内核和cudaMemcpyAsync
都被启动并与主机代码并行运行,因此我可以在这些函数完成之前调用它们,或者它只与主机代码并行运行同样的功能?
答案 0 :(得分:4)
在kernel / memcpy完成之前,是否可以调用kernel / cudaMemcpy的host方法?
是的,可能。如果您所做的只是调用内核和cudaMemcpyAsync
操作,那么调用它们的cpu函数可能会在操作完成之前完成/返回(即使它是您的main
例程!)
这些操作都是异步,这意味着它们不会阻塞调用它们的CPU线程。
即使你有很多CPU代码在内核调用和cudaMemcpyAsync
调用之后运行,也不能保证GPU活动会完成(甚至启动!),除非你使用一些同步主机的函数包含设备活动的主题,例如普通的cudaMemcpy
来电或cudaDeviceSynchronize()
来电或cudaStreamSynchronize()
或其他类似的来电。
这不受cpu /主机代码功能结构的影响。