版权声明:本文为博主原创文章,未经作者允许请勿转载。 https://blog.csdn.net/heiheiya https://blog.csdn.net/heiheiya/article/details/82017648
流是一系列顺序执行的命令。可以通过创建流对象来定义流,并且可以指定它作为一系列内核发射和设备主机间存储器拷贝的流参数。
下面就创建两个流。
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()等待指定流中所有的任务完成,然后释放流并将控制权返回给主机线程。