CUDA C编程权威指南 第六章 流和并发

cuda流

  1. 流分为两种类型:1)隐式声明流(空流),2)显式声明流(非空流)
  2. cudaError_t cudaMemcpyAsync(void* dst,const void* src, size_t count,cudaMemcpyKind kind,cudaStream_t stream = 0);异步拷贝版本
  3. cudaError_t cudaStreamCreate(cudaStream_t* pStream);创建可以显式管理的非空流,返回到pStream中的流就可以被当做流参数供cudaMemcpyAsync和其他异步的CUDA的api使用
  4. 当异步传输数据时,必须使用固定(非分页的)主机内存,使用cudaMallocHost函数或者cudaHOstAlloc函数
  5. 在非默认流中启动内核,必须在内核执行配置中提供一个流标志符作为第四个参数:kernel_name<<<grid,block,shareMemSize, stream>>>(argument list);
  6. 使用cudaError_t cudaStreamDesytroy(cudaStream_t stream);当流中仍然有未完成的工作,cudaStreamDestroy函数会立即返回,当流中的工作都已经完成时,与流相关的资源将被自动释放
  7. CUDA的api提供两个函数检查流中所有操作是否已经完成:
cudaError_t cudaStreamSynchronize(cudaStream_t stream);//强制阻塞主机,直到流中所有的操作都完成了
cudaError_t cudaStreamQuery(cudaStream_t stream);//不会阻塞,当所有操作完成时,返回`cudaSuccess`,否则返回`cudaErrorNotReady`

在这里插入图片描述

Hyper-Q

  1. 允许多个CPU线程或进程在单一的GPU上同时启动工作
  2. cudaError_t cudaStreamCreateWithPriority(cudaStream_t* pStream, unsigned int flags, int priority);设定流的优先级
  3. cudaError_t cudaDeviceGetStreamPriorityRange(int *leastPriority, int *greatestPriority);返回值存放在leastPrioritygreatestPriority中,如果设备不支持优先级,则返回0

cuda事件

  1. 事件声明:cudaEvent_t event;
  2. cudaError_t cudaEventCreate(cudaEvent_t* event);创建一个事件
  3. cudaError_t cudaEventDestroy(cudaEvent_t event);销毁事件
  4. cudaError_t cudaEventRecord(cudaEvent_t event,cudaStream_t stream = 0);事件在流执行中标记了一个点
  5. cudaError_t cudaEventSynchronize(cudaEvent_t event);等待或测试在指定流中闲钱操作的完成情况,等待一个事件会阻塞主机线程的调用,类似于cudaStreamSynchronize,但是其允许主机等待流执行的中间点.
  6. cudaError_t cudaEventQuery(cudaEvent_t event);测试一个事件是否可以不用阻塞主机应用程序来完成
  7. cudaError_t cudaEventElapsedTime(float* ms, cudaEvent_t start, cudaEvent_t stop);计算被两个事件标记的CUDA操作的运行时间

流回调

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值