(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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章