在CUDA中,流0如何与其他流相关?流0(默认流)是否与上下文中的其他流同时执行?
考虑以下示例:
cudaMemcpy(Dst, Src, sizeof(float)*datasize, cudaMemcpyHostToDevice);//stream 0;
cudaStream_t stream1;
/...creating stream1.../
somekernel<<<blocks, threads, 0, stream1>>>(Dst);//stream 1;
在上面的代码中,编译器是否可以确保somekernel
始终在cudaMemcpy
完成后启动,或者somekernel
将与cudaMemcpy
同时执行?
cudaMemcpy
调用(除特殊情况外)是一个同步调用。运行该代码的主机线程会阻塞,直到内存转移到主机。在cudaMemcpy
调用返回之前,它无法继续启动内核,这在复制操作完成之前不会发生。
更一般地,默认流(0或null)在GPU上隐式序列化操作,只要该流中的操作处于活动状态。如果在默认流中执行操作的同时创建流并将操作推入其中,则在默认流空闲之前,这些流中的所有并发性都将丢失。