如何防止两个 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 程序相互干扰的主要内容,如果未能解决你的问题,请参考以下文章

如何防止两个操作相互交错,同时仍然允许并发执行?

如何防止孩子在 fork() 之后干扰父母的标准输入

如何防止dragleave干扰嵌套dropzone元素上的dragenter事件?

正则表达式 - 如何在搜索文件时防止或解决文件之间的干扰?

如何防止 UITableViewCell 内的手势干扰 UITableView 的滚动?

如何防止子元素干扰 HTML5 拖放事件?