天天看點

(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]);      

4.其他問題