use*_*453 1 cuda gpu nvidia cuda-streams
在 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;
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,编译器能否确保始终在完成后somekernel
启动或与 并发执行? cudaMemcpy
somekernel
cudaMemcpy
cudaMemcpy
call 是(除特殊情况外)同步调用。运行该代码的主机线程会阻塞,直到内存传输到主机。在调用返回之前,它无法继续启动内核cudaMemcpy
,直到复制操作完成为止。
更一般地说,只要操作在该流中处于活动状态,默认流(0 或 null)就会隐式序列化 GPU 上的操作。如果您在默认流中执行操作的同时创建流并向其中推送操作,则这些流中的所有并发性都会丢失,直到默认流空闲为止。