学校有一个GPU计算集群,每个节点上有8个GPUS。并且我们使用SLURM任务管理系统来管理任务。 SLURM系统规定,如果GPU上有任务,则不会向该GPU分配新任务。
例如:在node1上,有8个TITAN XP GPU,并且没有一个提交任务,因此我们可以使用所有8个GPU。在这种情况下,我可以使用简单的c ++ / cuda代码来使用所有代码,例如:
for(int i = 0; i < 8; i++) {
cudaSetDevice(i);
......
}
但是几乎有人要提交任务,他们只能使用一个或两个GPU,like this。他的任务正在第二个GPU中运行。
如果我提交任务,也使用上面的简单代码,则会产生错误:
CUDA error at optStream.cu:496 code=10(cudaErrorInvalidDevice) "cudaSetDevice(coreID)"
我不知道如何解决这种情况,我不想检查空闲的GPU数量并重新编译程序,效率太低。
所以我需要一些建议。
答案 0 :(得分:2)
SLURM应该正确地将CUDA_VISIBLE_DEVICES
环境变量设置为分配给您工作的GPU的ID(提示:在脚本中回显此变量:如果没有发生,则必须对其进行修复)。
在您的代码中,您将需要使用“所有可用的GPU”,这并不意味着要使用所有物理可用的GPU,而是要使用该环境变量中列出的GPU。
您的代码可用于:
int count;
cudaGetDeviceCount ( &count );
for(int i = 0; i < count; i++) {
cudaSetDevice(i);
......
}
示例:如果CUDA_VISIBLE_DEVICES=2,3
比您的代码将在GPU 2,3上运行-但您将在代码中将它们视为设备0和1。