什么是MPS?
多进程服务(MPS)是CUDA应用程序编程接口(API)的另一种二进制兼容实现。MPS运行时架构被设计成透明地启用协作的多进程CUDA应用程序(通常是MPI作业),以利用最新的NVIDIA(基于kepler) gpu上的Hyper-Q功能。Hyper-Q允许CUDA内核在同一GPU上并行处理;这可以在GPU计算能力被单个应用程序进程未充分利用的情况下提高性能。
MPS是一个二进制兼容的客户端-服务器运行时实现的CUDA API,它由几个组件组成。
什么是Volta MPS?
Volta架构引入了新的MPS功能。与Volta之前 gpu上的MPS相比,Volta MPS提供了几个关键的改进:
MPS的好处:
1.提高GPU利用率
单个进程可能无法利用GPU上所有可用的计算和内存带宽容量。MPS允许不同进程的内核和memcopy操作在GPU上重叠,从而实现更高的利用率和更短的运行时间。
2.减少了对gpu的上下文存储
在没有MPS的情况下,使用GPU的每个CUDA进程在GPU上分配独立的存储和调度资源。相比之下,MPS服务器分配一个GPU存储副本,并调度所有客户端共享的资源。Volta MPS支持增加MPS客户机之间的隔离,因此资源减少的程度要小得多。
2.减少GPU上下文切换
如果没有MPS,当进程共享GPU时,它们的调度资源必须在GPU上和GPU外进行交换。MPS服务器在所有客户端之间共享一组调度资源,从而消除了GPU在这些客户端之间调度时的交换开销。
什么时候使用MPS?
当每个应用程序进程没有产生足够的工作来饱和GPU时,MPS是有用的。可以使用MPS在每个节点上运行多个进程,以支持更多的并发性。这样的应用程序是通过每个网格中有少量块来识别的。
此外,如果应用程序由于每个网格只有少量线程而导致GPU占用率较低,则可以通过MPS实现性能改进。建议在内核调用中使用更少的每个网格块和更多的每个块线程来增加每个块的占用率。MPS允许从其他进程运行的CUDA内核占用剩余的GPU容量。
这些情况出现在强缩放的情况下,计算能力(节点、CPU核心和/或GPU计数)增加,而问题大小保持不变。虽然总的计算工作量保持不变,但是每个进程的工作量减少了,并且可能在应用程序运行时没有充分利用可用的计算能力。使用MPS, GPU将允许不同进程的内核启动并发运行,并从计算中移除不必要的序列化点。