限制Cuda和OpenCL的资源访问

时间:2010-11-02 12:51:08

标签: linux cuda opencl ulimit

我们希望扩展我们的批处理系统以支持GPU计算。

问题在于从批处理系统的角度来看,GPU是一种资源。我们可以轻松统计已使用的资源,但我们还需要限制对它们的访问。

对于GPU而言,这意味着每个作业都专门声明GPU(当请求GPU时)。

据我所知,在作业之间共享GPU是一个非常糟糕的主意(因为GPU部分作业可能会被随机杀死)。

所以,我需要的是限制对CUDA和OpenCL的GPU访问的一些方法。批处理系统具有root权限。我可以使用/dev/限制cgroups中设备的访问权限,但我想,在这种情况下,这还不够。

理想状态是,如果作业只能看到所请求的GPU数量,那么任何其他工作都无法访问这些GPU。

3 个答案:

答案 0 :(得分:4)

目前有两种相关机制:

  • 使用nvidia-smi将设备设置为独占模式,这样一旦进程拥有GPU,其他任何进程都无法连接到同一GPU。
  • 使用CUDA_VISIBLE_DEVICES变量来限制进程在查找GPU时看到的GPU。

后者当然会受到滥用,但现在已经开始了。

  

据我所知,在作业之间共享GPU是一个非常糟糕的主意(因为GPU部分作业可能会被随机杀死)。

不是真的,共享GPU的一个坏主意的主要原因是他们将不得不竞争可用内存并且进程可能全部失败,即使实际上其中一个可能已经进行。此外,他们竞争访问DMA和计算引擎,这可能导致整体性能不佳。

答案 1 :(得分:1)

我相信有两件事可以帮助NVIDIA CUDA GPU:

  1. 通过nvidia-smi工具
  2. 将GPU置于“独占计算”模式
  3. 指示用户使用no-args“cudaSetDevice()”调用,它会自动选择一个未使用的GPU
  4. 指导用户使用其他方法初始化cudaSetDevice以外的设备,如"Best Practices Guide"
  5. 的第8.3节所述

    我不确定如何为OpenCL实现这一目标。

答案 2 :(得分:0)

我开发了一个库,可以对可用的OpenCL平台和设备进行排序。它将在平台上获得最佳设备。然后它尝试在其上创建一个上下文。如果失败,则转到列表中的下一个。列表按计算单位数排序。

它支持nvidia(gpu),amd(gpu& cpu),intel(cpu)和apple(gpu& cpu)。

存在独占访问的锁定机制。虽然这不是最好的。我还在寻找更好的解决方案。基本上它使用/ tmp中使用的平台+设备保存文件。

这就是我们在实验室中使用的内容。它可以在GPLv3下找到,可以在github上找到:https://github.com/nbigaouette/oclutils/