首先对这三个函数做一下解释:
cudaDeviceSynchronize() 会阻塞当前程序的执行,直到所有任务都处理完毕(这里的任务其实就是指的是所有的线程都已经执行完了kernel function)。
cudaThreadSynchronize()的功能和cudaDeviceSynchronize()基本上一样,这个函数在新版本的cuda中已经被“废弃”了,不推荐使用,如果程序中真的需要做同步操作,推荐使用cudaDeviceSynchronize()。
cudaStreamSynchronize()和上面的两个函数类似,这个函数带有一个参数,cuda流ID,它只阻塞那些cuda流ID等于参数中指定ID的那些cuda例程,对于那些流ID不等的例程,还是异步执行的。
按照Cuda官方文档上的解释,cuda kernel函数是异步执行的,也就是说,kernel函数在调用之后立即把控制权交换给CPU,CPU接着往下执行。基于这样的解释,那么我们在编写cuda程序时,比如: