流0(默认)和其他流的行为

时间:2013-08-26 11:38:29

标签: 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;

在上面的代码中,编译器是否可以确保somekernel始终启动 AFTER cudaMemcpy完成或somekernelcudaMemcpy同时执行?< / p>

1 个答案:

答案 0 :(得分:4)

cudaMemcpy调用(除了特定情况以外)是同步调用。运行该代码的主机线程将阻塞,直到内存传输到主机。在cudaMemcpy调用返回之前,它无法继续启动内核,直到复制操作完成才会发生。

更一般地,只要操作在该流中处于活动状态,默认流(0或null)就隐式地序列化GPU上的操作。如果在默认流中执行操作的同时创建流并将操作推入其中,则在默认流空闲之前,这些流中的所有并发都将丢失。