【发布时间】:2014-03-04 15:16:45
【问题描述】:
我有以下问题。我想让我的用户选择在哪个 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() 的地方崩溃,即使有此时没有错误。
【问题讨论】:
标签: cuda