在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
有多安全?
这种情况在很多地方都有记载:
- 编程指南:
内核启动和主机<->未指定任何流参数或将流参数设置为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