内存拷贝是如何同步的?

sumOfSquares<<<1, THREAD_NUM, 0>>>(gpudata, result, time);

int sum[THREAD_NUM];
clock_t time_used;
cudaMemcpy(&sum, result, sizeof(int) * THREAD_NUM, cudaMemcpyDeviceToHost);
cudaMemcpy(&time_used, time, sizeof(clock_t),cudaMemcpyDeviceToHost);

在这里
内核启动之后,CPU紧接着拷贝内存,是怎么拷贝的呢?
因为内核有可能还没计算完成
CPU 那端就要从GPU上拷贝内存?
就是说这个内存拷贝 CPU 和 GPU 是怎么保持同步的呢?

这个时候会自动同步

我想知道那个自动同步是怎么实现的

cudaMemcpy是同步调用的,它应该是在GPU上所有其他任务完成后才执行的。
cudaMemcpyAsyncs是异步的,但你必须制定跟kenerl不同的streamID。

手册上第三章和第五章节,好好看看

CPU与GPU同步代价很高
需要CPU线程不断查询GPU是否已经完成工作
或者把让给其他线程,但这样不能及时查询到GPU已经完成工作