如何防止两个 CUDA 程序相互干扰
Posted
技术标签:
【中文标题】如何防止两个 CUDA 程序相互干扰【英文标题】:How to prevent two CUDA programs from interfering 【发布时间】:2012-12-03 17:13:26 【问题描述】:我注意到,如果两个用户尝试同时运行 CUDA 程序,它往往会锁定卡或驱动程序(或两者?)。我们需要重置卡或重新启动机器以恢复正常行为。
有没有办法锁定 GPU,以便其他程序在运行时不会干扰它?
编辑
操作系统是在服务器上运行的 Ubuntu 11.10。虽然没有运行 X Windows,但该卡用于显示文本系统控制台。有多个用户。
【问题讨论】:
操作系统?硬件?系统是否在多个用户之间共享? 【参考方案1】:如果您使用 TCC 驱动程序在 Linux 或 Windows 上运行,您可以使用 nvidia-smi
utility 将 GPU 置于计算独占模式。
如果另一个进程已经在该 GPU 上持有上下文,则计算独占模式会使驱动程序拒绝上下文建立请求。任何尝试在繁忙的计算专用 GPU 上运行的进程都会收到无可用设备错误并失败。
【讨论】:
谢谢。这似乎是最容易做到的。但我不确定 EXCLUSIVE_THREAD 和 EXCLUSIVE_PROCESS 之间的区别。手册页写得很尴尬。 “EXCLUSIVE_PROCESS”表示每个设备只允许一个上下文,一次可从多个线程使用。 @BarryBrown:区别仅在于是否允许来自同一进程中的多个线程的上下文共享,或者只有一个线程可以访问 GPU。在 CUDA 4.0 和更新版本中,API 被设为线程安全的,因此来自持有上下文的进程中的任何线程都可以访问 GPU。在此之前,上下文与创建它们的线程相关联。您可能希望在大约 99% 的实际案例中使用EXCLUSIVE_PROCESS
。当您在没有显示管理器的情况下运行时,您可能还想查看持久性模式,以便在 GPU 空闲时不会卸载驱动程序。
感谢您的澄清。我会将nvidia-smi -c EXCLUSIVE_PROCESS
添加到启动脚本中。它已经在使用持久化模式。
@talonmies 我还是有点困惑。手册中提到“默认”意味着每个设备允许多个上下文的计算模式。”这不是意味着多个 cuda 程序可以驻留在 Linux 中的同一设备上吗?
@KingCrimson:你注意到我说的是独占模式而不是默认模式吗?现在有两种独占模式:“线程独占”和“进程独占”。它们的工作方式与我在回答中描述的完全一样,但在两个不同的粒度级别上。【参考方案2】:
您可以使用类似Task Spooler 的方式将程序排队并同时运行一个。
我们使用TORQUE Resource Manager,但它比ts
更难配置。使用 TORQUE,您可以拥有多个队列(即一个用于 cuda 作业,两个用于 cpu 作业)并为每个 gpu 分配不同的作业。
【讨论】:
以上是关于如何防止两个 CUDA 程序相互干扰的主要内容,如果未能解决你的问题,请参考以下文章
如何防止dragleave干扰嵌套dropzone元素上的dragenter事件?