如何销毁在特定设备上创建的流?
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
的结果。
当通过以下方式在特定 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
的结果。