首页 > 解决方案 > 如何销毁在特定设备上创建的流?

问题描述

当一个 CUDA 流在特定的devicevia 上创建时:

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

在删除之前我必须重新设置设备,还是我可以打电话?

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

标签: cuda

解决方案


不,你不必。至于CUDA 文档
“如果将内核发布到与当前设备无关的流,则内核启动将失败即使将其发布到与当前设备无关的流,内存副本也会成功。
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

在此处输入图像描述


推荐阅读