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

Lor*_*ins 6 cuda

当在特定通道上创建 CUDA 流时device

int device = 1; // Example number
cudaSetDevice(device);
cudaStream_t cudaStream;
cudaStreamCreate(&cudaStream); // Similar with cudaStreamCreateWithFlags
Run Code Online (Sandbox Code Playgroud)

在删除设备之前我是否必须重新设置该设备,或者我可以直接打电话吗?

// cudaSetDevice(device); // Is this needed ???
cudaStreamDestroy(cudaStream);
Run Code Online (Sandbox Code Playgroud)

Abd*_*tef 6

不,你不必这样做。至于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));
Run Code Online (Sandbox Code Playgroud)

这是 的结果cudaStatus

在此输入图像描述

  • cudaStream_t (CUstream) 有一个对 CUcontext 的内部引用。API 不需要将上下文设置为当前上下文。 (3认同)