(Cuda)流Stream(三)

本文地址:http://blog.csdn.net/mounty_fsc/article/details/51092933

1.流(stream)的理解

一个流对应并发的概念,是一组顺序执行的操作(可能由多个主机线程发出);
多个流对应并行的概念,因为发生顺序具有不确定性。

2.相关函数

//基本函数
cudaStream_t stream//定义流
cudaStreamCreate(cudaStream_t * s)//创建流
cudaStreamDestroy(cudaStream_t s)//销毁流
//显性同步
cudaStreamSynchronize()//同步单个流:等待该流上的命令都完成
cudaDeviceSynchronize()//同步所有流同步:等待整个设备上流都完成
cudaStreamWaitEvent()//通过某个事件:等待某个事件结束后执行该流上的命令
cudaStreamQuery()//查询一个流任务是否完成
//回调
cudaStreamAddCallback()//在任何点插入回调函数
//优先级
cudaStreamCreateWithPriority()
cudaDeviceGetStreamPriorityRange()

3.例子

//创建两个流
cudaStream_t stream[2];
for (int i = 0; i < 2; ++i)
    cudaStreamCreate(&stream[i]);
float* hostPtr;
cudaMallocHost(&hostPtr, 2 * size);
...
//两个流,每个流有三个命令
for (int i = 0; i < 2; ++i) {
    //从主机内存复制数据到设备内存
    cudaMemcpyAsync(inputDevPtr + i * size, hostPtr + i * size, size, cudaMemcpyHostToDevice, stream[i]);
    //执行Kernel处理谁被内存
    MyKernel <<<100, 512, 0, stream[i]>>>(outputDevPtr + i * size, inputDevPtr + i * size, size);
    //从设备内存到主机内存
    cudaMemcpyAsync(hostPtr + i * size, outputDevPtr + i * size, size, cudaMemcpyDeviceToHost, stream[i]);
}
...
//销毁流
for (int i = 0; i < 2; ++i)
    cudaStreamDestroy(stream[i]);

说明:

  1. 以上代码定义了两个流,每个流有三个命令,见注释
  2. 同一个流内顺序执行,流与流见异步执行
  3. 重叠行为参见[1]

4.其他问题

  1. 函数中若不指定流或者赋值为0,则为默认流
  2. 流还有隐性同步问题和重叠行为的问题

[1].http://docs.nvidia.com/cuda/cuda-c-programming-guide/#streams

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值