我有以下问题。我想让我的用户选择要运行的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()此时没有错误。
答案 0 :(得分:3)
您必须先检查系统中有多少GPU可用。可以使用cudaGetDeviceCount
。
int deviceCount = 0;
cudaGetDeviceCount(&deviceCount);
然后检查用户输入是否大于可用设备。
if (userDeviceInput < deviceCount)
{
cudaSetDevice(userDeviceInput);
}
else
{
printf("error: invalid device choosen\n");
}
提醒cudaSetDevice
是基于0索引的!因此,我检查userDeviceInput < deviceCount
。