我有一个程序,在GPU上进行一系列计算,然后在CPU上对这些结果进行内存操作,接着取下一批数据,重复以上步骤。现在如果我能够在CPU处理内存操作的同时开始处理第二批数据,那么程序将会更快。如何实现这个功能呢?
我有一个程序,在GPU上进行一系列计算,然后在CPU上对这些结果进行内存操作,接着取下一批数据,重复以上步骤。现在如果我能够在CPU处理内存操作的同时开始处理第二批数据,那么程序将会更快。如何实现这个功能呢?
function<<<blocks, threads>>>()
)都是异步的,它们会立即返回控制权给调用主机线程。因此,只需在内核调用后放置CPU工作,就可以始终并行执行CPU工作和GPU工作。deviceOverlap
字段设置为true的GPU(使用cudaGetDeviceProperties()
进行检查),并且您需要在单独的CUDA流中使用cudaMemcpyAsync()
。<<<grid,block>>myCUDAfunc(); cudaMemcpy();
在 cudaMemcpy 开始复制结果之前,我怎样知道 myCUDAfunc() 已经完成了呢? - foges<<<>>>
中的可选第4个参数),它将在默认流中运行,该流始终与其他默认流CUDA命令同步。因此,如果在内核之后调用,则cudaMemcpy
也是同步的,将始终在内核之后执行。如果要进行异步复制,则必须使用cudaMemcpyAsync,并需要一个流标识符参数。 - harrism在GPU上进行第一批计算
进入循环:{
将结果从设备内存复制到主机内存
在GPU中执行下一批计算(核的启动是异步的,控制立即返回到CPU)
处理上一次迭代的结果
}
从设备内存中复制最后一次迭代的结果到主机内存