我对CUDA流很困惑.我已经了解到cudaStreamSynchronize()
等待特定流的GPU操作完成.如果我们调用了2个内核,那么对于一个流,内核将按顺序执行; 对于流,第一个内核将被执行,而下一个内核将仅在第一个内核完成后执行.
我想问的是,如果我们有一个流,是否有必要同步流?它是否按顺序执行是否为单个流同步它?
是的,按顺序执行发出到同一流(默认流或任何流)的cuda调用.它们是序列化的.
对于某些特定情况,您可能仍会在该流中发出同步命令,在执行某些CPU代码之前,您需要等待GPU活动完成.在内核调用之后立即发出的CPU代码或者在cudaMemcpyAsync
例如紧接之后发出的CPU代码通常将与前面的(cuda)调用同时执行.
一个特定情况可能是cuda错误检查.另一个具体情况可能是,如果您在零拷贝固定内存中异步进行某些CPU/GPU数据交换(不需要发出显式cudaMemcpy...
调用).
但是当发布到同一个流时,通常不需要显式同步通常cudaMemcpyAsync...kernel call...cudaMemcpyAsync
模式的cuda调用.流将为您做到这一点.