在CUDA中,是否保证默认流等于nullptr ?



在CUDA的driver_types.h中,我们有:

typedef __device_builtin__ struct CUstream_st *cudaStream_t;

cuda_runtime.h中,我们在许多地方都有默认初始化的流参数。例如:

template<class T>
    static __inline__ __host__ cudaError_t cudaLaunchKernel(
    const T *func,
    dim3 gridDim,
    dim3 blockDim,
    void **args,
    size_t sharedMem = 0,
    cudaStream_t stream = 0
)

假设默认流是(cudaStream) nullptr有多安全?

这种情况在很多地方都有记载:

  1. 编程指南:

内核启动和主机<->未指定任何流参数或将流参数设置为0 的设备内存副本被发送到默认流。

  • 例如,cudaMemcpyAsync:
  • 通过传递一个非零的流实参,可选择将副本关联到流。

    假设默认流相当于(cudaStream_t) 0

    似乎很安全

    请注意,您可以使用这里描述的cudaStreamLegacy(或cudaStreamPerThread),使用非零参数专门调用默认流。有趣的是,在CUDA 11.4中,cudaStreamLegacy是driver_types.h中的#define,如下所示:

    #define cudaStreamLegacy ((cudaStream_t)0x1)
    

    这可能是有意义的,因为它总是与遗留的默认流相关联,而流参数0将引用当前系统定义的默认流,无论它恰好是遗留的默认流还是每个线程的默认流,如前面链接的博客所示。

    同理,cudaStreamPerThread定义为(cudaStream_t)2

    相关内容

    • 没有找到相关文章

    最新更新