在当今的许多服务器级机器上,在新创建的进程中初始化 CUDA 可能需要半秒或更长的时间。正如@RobertCrovella解释的那样,CUDA 初始化通常包括建立统一内存模型,这涉及设备和主机内存映射的协调。对于具有大量内存的机器,这可能需要相当长的时间;并且可能还有其他因素导致这种长时间的延迟。
当您想要运行一系列使用 CUDA 的进程时,这种效果会变得非常烦人,这些进程不使用复杂的虚拟内存映射:它们每个都必须等待他们漫长的等待——尽管事实上“基本上”,它们可以重新-使用 CUDA 是否上次进行的初始化(可能使用一些清理代码)。
现在,显然,如果您以某种方式重写所有这些进程的代码以在单个进程中执行 - 这将为您节省那些漫长的初始化成本。但是没有更简单的方法吗?关于什么:
- 在进程之间传递相同的状态信息/CUDA 上下文?
- 告诉 CUDA 完全忽略大多数主机内存?
- 让统一内存协调比现在更懒惰,以便它只在实际需要的情况下发生?
- 在禁用统一内存的情况下启动 CUDA?
- 保留一些守护进程并锁定它已经初始化的 CUDA 状态?