1

在当今的许多服务器级机器上,在新创建的进程中初始化 CUDA 可能需要半秒或更长的时间。正如@RobertCrovella解释的那样,CUDA 初始化通常包括建立统一内存模型,这涉及设备和主机内存映射的协调。对于具有大量内存的机器,这可能需要相当长的时间;并且可能还有其他因素导致这种长时间的延迟。

当您想要运行一系列使用 CUDA 的进程时,这种效果会变得非常烦人,这些进程不使用复杂的虚拟内存映射:它们每个都必须等待他们漫长的等待——尽管事实上“基本上”,它们可以重新-使用 CUDA 是否上次进行的初始化(可能使用一些清理代码)。

现在,显然,如果您以某种方式重写所有这些进程的代码以在单个进程中执行 - 这将为您节省那些漫长的初始化成本。但是没有更简单的方法吗?关于什么:

  • 在进程之间传递相同的状态信息/CUDA 上下文?
  • 告诉 CUDA 完全忽略大多数主机内存?
  • 让统一内存协调比现在更懒惰,以便它只在实际需要的情况下发生?
  • 在禁用统一内存的情况下启动 CUDA?
  • 保留一些守护进程并锁定它已经初始化的 CUDA 状态?
4

1 回答 1

1

你问的已经存在了。它被称为 MPS(多进程服务),它基本上通过一个模拟驱动程序 API 的守护进程来保持单个 GPU 上下文始终处于活动状态。最初的目标应用程序是 MPI,但它基本上可以满足您的设想。

在这里阅读更多:

https://docs.nvidia.com/deploy/pdf/CUDA_Multi_Process_Service_Overview.pdf

http://on-demand.gputechconf.com/gtc/2015/presentation/S5584-Priyanka-Sah.pdf

于 2017-02-17T12:47:27.637 回答