我有一个程序,我在GPU上进行了一系列计算,然后我在CPU上执行这些结果的内存操作,然后我接下来的批处理数据并全部执行相同操作.现在,如果我可以进行第一组计算,然后从第二批开始,而我的CPU在内存操作中搅拌,那将会快得多.我该怎么办?
所有CUDA内核调用(例如function<<<blocks, threads>>>()
)都是异步的 - 它们立即将控制权返回给调用主机线程.因此,只需在内核调用之后使CPU工作,就可以始终与GPU工作并行执行CPU工作.
如果您还需要同时将数据从GPU传输到CPU,则需要将deviceOverlap
字段设置为true(检查使用cudaGetDeviceProperties()
)的GPU ,并且需要使用cudaMemcpyAsync()
单独的CUDA流.
有一些示例可以在NVIDIA CUDA SDK中演示此功能 - 例如"simpleStreams"和"asyncAPI"示例.