假设我有4个GPU,并希望并行运行50个CUDA程序。我的问题是:NVIDIA驱动程序是否足够智能,可以在不同的GPU上运行50个CUDA程序,还是必须为每个程序设置CUDA设备?
谢谢
答案 0 :(得分:5)
要做的第一点是,您无法在任何CUDA平台上的4个GPU上运行50个并行的应用程序。如果您拥有支持Hyper-Q的GPU,则最多可能有32个线程或MPI进程排队工作到GPU。否则就会有一个命令队列。
除了最新的Kepler Tesla卡以外,CUDA驱动程序一次只支持一个活动上下文。如果您在GPU上运行多一个应用程序,那么这些进程将具有仅以“先到先得”为基础相互竞争的上下文。如果一个应用程序使用长时间运行的内核或类似内容阻止另一个应用程序,则没有先发制人或其他任何使该进程屈服于另一个进程的内容。当GPU与显示管理器共享时,有一个看门狗定时器会在应用程序将其上下文杀死之前施加几秒的上限。结果是,一次只能在硬件上运行一个上下文。上下文切换不是免费的,并且让多个进程竞争单个设备会有性能损失。
此外,GPU上的每个上下文都需要设备内存。在你要求的平台上,linux没有内存分页,因此每个上下文的资源必须在GPU内存中共存。我不相信在任何当前的GPU上同时运行12个非平凡的上下文是可能的 - 在这个数字之前你会耗尽可用的内存。尝试运行更多应用程序会导致上下文建立失败。
对于在多个GPU上分发多个应用程序的驱动程序的行为,AFAIK linux驱动程序不会在GPU之间进行任何智能的进程分发,除非一个或多个GPU处于非默认计算模式。如果没有特别请求设备,驱动程序将始终尝试找到它可以运行进程或线程的第一个有效的免费GPU。如果GPU忙并且标记为计算独占(线程或进程)或标记为禁止,则在尝试查找要运行的GPU时,驱动程序将跳过它。如果所有GPU都是独占的并且被占用或禁止,则应用程序将因无效设备可用错误而失败。
总而言之,除了Hyper-Q设备之外的其他所有内容,在做你要求的事情时都没有性能上的提升(恰恰相反),如果你尝试的话,我希望它会中断。一个更加理智的方法是将计算排他性与资源管理任务调度程序(如Torque)或其中一个(以前的)Sun Grid Engine版本结合使用,这可以根据GPU的可用性安排您的流程以有序的方式运行。这就是大多数通用HPC集群处理多gpu环境中的调度的方式。