我有以下问题。我想让我的用户选择要在哪个GPU上运行。因此,我在只有一个GPU(设备0)的计算机上进行了测试,如果他们选择了不存在的设备会发生什么情况。

如果我执行cudaSetDevice(0);,它将正常工作。

如果我这样做:cudaSetDevice(1);,它将与invalid device ordinal崩溃(我可以处理此问题,因为函数返回错误)。

如果我这样做:cudaSetDevice(0); cudaSetDevice(1);,它将与invalid device ordinal崩溃(我可以处理此问题,因为函数返回错误)。

但是! 如果执行以下操作:cudaSetDevice(1); cudaSetDevice(0);第二条命令返回成功,但是在我第一次尝试在GPU上进行计算时,它会因invalid device ordinal而崩溃。我无法处理此问题,因为第二个命令不会返回错误!

在我看来,第一个cudaSetDevice留下了一些影响第二个命令的内容?

非常感谢!

解决方案:(感谢Robert Crovella!)。
我正在处理类似的错误:

error = cudaSetDevice(1);
if (error) { blabla }

但是显然您需要在cudaSetDevice(1)之后调用cudaGetLastError(),因为否则错误消息不会从某些错误堆栈中删除,并且即使稍后在我为另一个功能执行cudaGetLastError()的位置时它也会崩溃,即使没有错误发生这点。

最佳答案

您必须首先检查系统中有多少个GPU。使用cudaGetDeviceCount是可能的。

int deviceCount = 0;
cudaGetDeviceCount(&deviceCount);

然后检查用户输入是否大于可用设备。
if (userDeviceInput < deviceCount)
{
  cudaSetDevice(userDeviceInput);
}
else
{
  printf("error: invalid device choosen\n");
}

提醒cudaSetDevice是基于0索引的!因此,我检查userDeviceInput < deviceCount

关于CUDA:设备序号无效,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22175825/

10-12 23:36