我有以下问题。我想让我的用户选择要在哪个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/