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