在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文档:
“如果是颁发给没有关联到当前设备的存储副本会成功,即使它被颁发给没有关联到当前设备的流的内核启动将失败。
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
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句