对于主机来说, 由于需要CUDA API调用和所有点的内核启动不是同步的, cudaDeviceSynchonize函数可以用来阻塞主机应用程序, 直到所有CUDA操作(复制, 核函数等)完成:
cudaError_t...cudaDeviceSynchronize(void);
这个函数可能会从先前的异步CUDA操作返回错误, 因为在一个线程块中线程束以一个为定义的顺序被执行, CUDA提供了一个使用块局部栅栏来同步他们的执行的功能...在栅栏之前所有线程产生的所有全局内存和共享内存访问, 将会在栅栏后对线程块中所有其他的线程可见. 该函数可以协调一个块中线程之间的通信, 但他强制线程束空闲, 从而可能对性能产生负面影响....块间同步, 唯一安全的方法就是在每个内核执行结束端使用全局同步点, 也就是说, 在全局同步后, 终止当前的核函数, 开始执行新的核函数....不同块中的线程不允许相互同步, 因此GPU可以以任意顺序执行块. 这使得CUDA程序在大规模并行GPU上是可扩展的.