流是一系列順序執行的命令。可以通過創建流對象來定義流,並且可以指定它作爲一系列內核發射和設備主機間存儲器拷貝的流參數。
下面就創建兩個流。
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]);
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]);
cudaStreamDestroy()等待指定流中所有的任務完成,然後釋放流並將控制權返回給主機線程。