cuda - 如何销毁在特定设备上创建的流?
问题描述
当一个 CUDA 流在特定的device
via 上创建时:
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
。
推荐阅读
- python - 来自 cryptography.fernet 的 Fernet 在 Heroku 上提出了 InvalidToken
- javascript - Javascript 将字符串常量定义为速记属性
- javascript - 识别 css 选择器字符串与 XPath 字符串
- r - 在 R 中使用 regsubset 进行变量选择
- javascript - 没有 websockets 的客户端服务器 2 路 web 通信
- android - 如何一对一读取drawable文件夹中的所有图像
- r - 如何使用具有 tidyverse 功能的 googleway 批量地理编码?
- python - 如何将小部件放在窗口内的框架内?
- python - 通过排除日期范围对 DatetimeIndex 进行 pandas 过滤
- c# - 如何检查登录会话以拒绝多次登录 SQL Server 中的 c# winform 应用程序?