我们希望扩展我们的批处理系统以支持GPU计算。
问题在于从批处理系统的角度来看,GPU是一种资源。我们可以轻松统计已使用的资源,但我们还需要限制对它们的访问。
对于GPU而言,这意味着每个作业都专门声明GPU(当请求GPU时)。
据我所知,在作业之间共享GPU是一个非常糟糕的主意(因为GPU部分作业可能会被随机杀死)。
所以,我需要的是限制对CUDA和OpenCL的GPU访问的一些方法。批处理系统具有root权限。我可以使用/dev/
限制cgroups
中设备的访问权限,但我想,在这种情况下,这还不够。
理想状态是,如果作业只能看到所请求的GPU数量,那么任何其他工作都无法访问这些GPU。
答案 0 :(得分:4)
目前有两种相关机制:
后者当然会受到滥用,但现在已经开始了。
据我所知,在作业之间共享GPU是一个非常糟糕的主意(因为GPU部分作业可能会被随机杀死)。
不是真的,共享GPU的一个坏主意的主要原因是他们将不得不竞争可用内存并且进程可能全部失败,即使实际上其中一个可能已经进行。此外,他们竞争访问DMA和计算引擎,这可能导致整体性能不佳。
答案 1 :(得分:1)
我相信有两件事可以帮助NVIDIA CUDA GPU:
nvidia-smi
工具cudaSetDevice
以外的设备,如"Best Practices Guide" 我不确定如何为OpenCL实现这一目标。
答案 2 :(得分:0)
我开发了一个库,可以对可用的OpenCL平台和设备进行排序。它将在平台上获得最佳设备。然后它尝试在其上创建一个上下文。如果失败,则转到列表中的下一个。列表按计算单位数排序。
它支持nvidia(gpu),amd(gpu& cpu),intel(cpu)和apple(gpu& cpu)。
存在独占访问的锁定机制。虽然这不是最好的。我还在寻找更好的解决方案。基本上它使用/ tmp中使用的平台+设备保存文件。
这就是我们在实验室中使用的内容。它可以在GPLv3下找到,可以在github上找到:https://github.com/nbigaouette/oclutils/