当在特定通道上创建 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)
不,你不必这样做。至于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。
| 归档时间: |
|
| 查看次数: |
824 次 |
| 最近记录: |