流
cuda流
- 流分为两种类型:1)隐式声明流(空流),2)显式声明流(非空流)
cudaError_t cudaMemcpyAsync(void* dst,const void* src, size_t count,cudaMemcpyKind kind,cudaStream_t stream = 0);
异步拷贝版本cudaError_t cudaStreamCreate(cudaStream_t* pStream);
创建可以显式管理的非空流,返回到pStream中的流就可以被当做流参数供cudaMemcpyAsync
和其他异步的CUDA的api使用- 当异步传输数据时,必须使用固定(非分页的)主机内存,使用
cudaMallocHost
函数或者cudaHOstAlloc
函数 - 在非默认流中启动内核,必须在内核执行配置中提供一个流标志符作为第四个参数:
kernel_name<<<grid,block,shareMemSize, stream>>>(argument list);
- 使用
cudaError_t cudaStreamDesytroy(cudaStream_t stream);
当流中仍然有未完成的工作,cudaStreamDestroy
函数会立即返回,当流中的工作都已经完成时,与流相关的资源将被自动释放 - CUDA的api提供两个函数检查流中所有操作是否已经完成:
cudaError_t cudaStreamSynchronize(cudaStream_t stream);
cudaError_t cudaStreamQuery(cudaStream_t stream);
Hyper-Q
- 允许多个CPU线程或进程在单一的GPU上同时启动工作
cudaError_t cudaStreamCreateWithPriority(cudaStream_t* pStream, unsigned int flags, int priority);
设定流的优先级cudaError_t cudaDeviceGetStreamPriorityRange(int *leastPriority, int *greatestPriority);
返回值存放在leastPriority
和greatestPriority
中,如果设备不支持优先级,则返回0
cuda事件
- 事件声明:
cudaEvent_t event;
cudaError_t cudaEventCreate(cudaEvent_t* event);
创建一个事件cudaError_t cudaEventDestroy(cudaEvent_t event);
销毁事件cudaError_t cudaEventRecord(cudaEvent_t event,cudaStream_t stream = 0);
事件在流执行中标记了一个点cudaError_t cudaEventSynchronize(cudaEvent_t event);
等待或测试在指定流中闲钱操作的完成情况,等待一个事件会阻塞主机线程的调用,类似于cudaStreamSynchronize
,但是其允许主机等待流执行的中间点.cudaError_t cudaEventQuery(cudaEvent_t event);
测试一个事件是否可以不用阻塞主机应用程序来完成cudaError_t cudaEventElapsedTime(float* ms, cudaEvent_t start, cudaEvent_t stop);
计算被两个事件标记的CUDA操作的运行时间
流回调