【问题标题】:The behavior of stream 0 (default) and other streams流 0(默认)和其他流的行为
【发布时间】:2017-10-27 07:54:27
【问题描述】:

在 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完成,还是somekernel会与cudaMemcpy同时执行?

【问题讨论】:

    标签: cuda gpu nvidia cuda-streams


    【解决方案1】:

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

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

    【讨论】:

    • 值得注意的是,NVIDIA 更改了设备运行时的 NULL (0) 流的定义。对于主机运行时,NULL 流强制连接所有未完成的流,因此通常仅对 CPU/GPU 并发有用。对于设备运行时,NULL 流是“它自己的”流;其他流可以与它同时运行,并且必须使用 cudaStreamWaitEvent() 显式强制执行同步。
    猜你喜欢
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 2022-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多