如何销毁在特定设备上创建的流?

How to destroy a stream that was created on a specific device?

当通过以下方式在特定 device 上创建 CUDA 流时:

int device = 1; // Example number
cudaSetDevice(device);
cudaStream_t cudaStream;
cudaStreamCreate(&cudaStream); // Similar with cudaStreamCreateWithFlags

删除前是否需要重新设置设备,还是直接打电话就可以?

// cudaSetDevice(device); // Is this needed ???
cudaStreamDestroy(cudaStream);

不,您不必这样做。至于CUDA documentation
“如果将内核发布到与当前设备无关的流,内核启动将失败 内存复制将成功,即使它被发布到与当前设备无关的流。
cudaEventRecord() 如果输入事件和输入流关联到不同的设备,将失败。 cudaEventElapsedTime() 如果两个输入事件关联到不同的设备,将失败。
即使输入事件关联到与当前设备不同的设备,cudaEventSynchronize()cudaEventQuery() 也会成功。
cudaStreamWaitEvent() 即使输入流和输入事件关联到不同的设备也会成功。 cudaStreamWaitEvent() 因此可用于使多个设备相互同步。"

所以没有提到关于cudaStreamDestroy()的问题,我使用两个GPU设备测试它,设置第一个设备,在其上创建一个流,然后设置第二个设备并在其上创建另一个流.之后,我 运行 第二个设备上的内核,然后我没有错误地销毁了第二个流和第一个流,并且不需要再次设置第一个设备。

cudaStatus = cudaSetDevice(0);
cudaStream_t s0;
cudaStreamCreate(&s0);
cudaStatus = cudaSetDevice(1);
cudaStream_t s1;
cudaStreamCreate(&s1);
addKernel<<<1, size, 1, s1>>>(dev_c, dev_a, dev_b);
cudaDeviceSynchronize();
cudaStatus = cudaStreamDestroy(s1);
fprintf(stderr, "%s\n", cudaGetErrorString(cudaStatus));
cudaStatus = cudaStreamDestroy(s0);
fprintf(stderr, "%s\n", cudaGetErrorString(cudaStatus));

这是cudaStatus的结果。