(Cuda)流Stream(三)

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

你可能感兴趣的:((Cuda)流Stream(三))