Cuda 多个GPU和多个可执行文件

Cuda 多个GPU和多个可执行文件,cuda,Cuda,假设我有4个GPU,想并行运行50个CUDA程序。我的问题是:英伟达的驱动程序是否足够聪明,可以在不同的GPU上运行50个CUDA程序,或者我必须为每个程序设置CUDA设备吗? 谢谢首先要指出的是,在任何CUDA平台上,您都无法在4个GPU上并行运行50个应用程序。如果您有一个支持Hyper-Q的GPU,则最多可能有32个线程或MPI进程将工作排队到GPU。否则,只有一个命令队列 对于除最新的开普勒特斯拉卡以外的任何其他卡,CUDA驱动程序一次只支持一个活动上下文。如果您在一个GPU上运行多个应

假设我有4个GPU,想并行运行50个CUDA程序。我的问题是:英伟达的驱动程序是否足够聪明,可以在不同的GPU上运行50个CUDA程序,或者我必须为每个程序设置CUDA设备吗?
谢谢

首先要指出的是,在任何CUDA平台上,您都无法在4个GPU上并行运行50个应用程序。如果您有一个支持Hyper-Q的GPU,则最多可能有32个线程或MPI进程将工作排队到GPU。否则,只有一个命令队列

对于除最新的开普勒特斯拉卡以外的任何其他卡,CUDA驱动程序一次只支持一个活动上下文。如果您在一个GPU上运行多个应用程序,那么这两个进程的上下文都将以“先到先服务”的方式相互竞争。如果一个应用程序使用一个长时间运行的内核或类似的内核来阻止另一个应用程序,那么就不会有任何先发制人或其他使进程屈服于另一个进程的事情。当GPU与显示管理器共享时,会有一个看门狗计时器,它会在应用程序终止其上下文之前施加几秒钟的上限。结果是一次只能在硬件上运行一个上下文。上下文切换不是免费的,多个进程争用一个设备会导致性能下降

此外,GPU上的每个上下文都需要设备内存。在您询问的平台linux上,没有内存分页,因此每个上下文的资源都必须在GPU内存中共存。我不相信在任何当前的GPU上同时运行12个非平凡的上下文是可能的——在这个数字出现之前,您的可用内存就会耗尽。尝试运行更多应用程序将导致上下文建立失败

至于驱动程序在多个GPU上分发多个应用程序的行为,AFAIK linux驱动程序不会在GPU之间进行任何进程智能分发,除非一个或多个GPU处于非默认计算模式。如果没有特别请求任何设备,驱动程序将始终尝试并找到第一个有效、可用的GPU,它可以在其上运行进程或线程。如果GPU正忙,并且标记为“计算独占”(线程或进程)或标记为“禁止”,则驱动程序在尝试查找要运行的GPU时将跳过该GPU。如果所有GPU都是独占的、被占用的或被禁止的,则应用程序将失败,并出现“无有效设备可用”错误


总之,对于除Hyper-Q设备以外的所有设备,按照您的要求进行操作不会带来性能提升(恰恰相反),如果您尝试,我希望它会崩溃。更明智的方法是将计算独占性与资源管理任务调度器(如Torque)或(以前)Sun Grid Engine版本之一结合使用,它可以根据GPU的可用性安排进程以有序方式运行。这就是大多数通用HPC群集在多gpu环境中处理调度的方式。

确切地说,是哪个CUDA驱动程序?这个问题有不止一个答案…我在Linux上使用了英伟达331.20版本的CUDA驱动程序5.5。Talon的答案是很棒的,只是要补充一些东西:如果你的CUDA程序使用NVIDIA引擎,确保工作量分配不被支持。如果它们是通用的CUDA程序,那么talon的答案可能是实现IMHO的唯一途径