【问题标题】:How do I mitigate CUDA's very long initialization delay?如何缓解 CUDA 很长的初始化延迟?
【发布时间】:2017-07-06 23:37:39
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: optimization cuda initialization delay unified-memory


    【解决方案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

    【讨论】:

    • 嗯,听起来有点沉重和负担过重。而且我不想一直做IPC……但那是FOSS吗?也许人们只能采用较低层并组合出一个更简单的替代方案。
    • 这是 NVIDIA 提供的代码库。我希望它是封闭源代码。
    • MPS 是封闭源代码。另一种可能在某些情况下为具有多个 GPU 的机器提供一些缓解的方法是通过CUDA_VISIBLE_DEVICESenvironment variable 限制 CUDA 运行时仅使用必要的 GPU。这可以按进程指定。这种方法还可以在某些 pre-Pascal UM 场景中提供一些好处。
    • 我想知道 用户 向操作系统开发人员施加压力以加快用于设置 UVM 所需的内存映射的相关操作系统调用是否会有所帮助?显然不是针对个人用户的短期解决方案。
    • 这个工具似乎只适用于 Linux。如何缓解Windows上CUDA初始化的问题?
    猜你喜欢
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 2017-11-11
    • 1970-01-01
    相关资源
    最近更新 更多