"持久模式"实际上做了什么来减少CUDA启动时间?

ein*_*ica 9 cuda

启动CUDA运行时需要一定的时间来协调设备和主机的UVM存储器映射; 看到:

现在,有人建议我使用持久模式可以显着减轻这种现象.以什么方式?我的意思是,当启用持久性模式时,会发生什么,或者不会发生什么,并且存在使用CUDA的进程?

文件说:

持久性模式是用户可设置的驱动程序属性的术语,即使没有客户端连接到目标GPU,也会保持目标GPU的初始化.

但是 - "保持初始化"是什么意思?稍后,关于持久性守护进程的部分(与持久性模式不同)说:

只要一个或多个客户端打开设备文件,GPU状态就会保持在驱动程序中.一旦所有客户端关闭了设备文件,除非启用持久性模式,否则将卸载GPU状态.

究竟什么是卸载?到哪里卸货?它与内存大小有什么关系?如果在系统上没有发生任何重大事件,为什么需要花费这么多时间来加载它呢?

Rob*_*lla 10

GPU/CUDA启动序列有两个主要部分:

  1. 设备初始化时间
  2. CUDA上下文"懒惰"初始化

现代CUDA GPU可以以多种电源状态之一存在.当前的电源状态可以nvidia-smi通过NVML或通过NVML观察到(虽然注意运行工具的效果nvidia-smi可能会修改GPU的电源状态.)当GPU没有被用于任何目的时(即它是空闲的,技术上:否任何类型的上下文都在GPU上实例化,并且未启用持久性模式,GPU与GPU驱动程序一起将自动将其电源状态降低到非常低的水平,有时包括完全关闭电源的情况.

将GPU移动到较低功率状态的过程将涉及关闭或修改各种硬件的行为.例如,减少内存时钟,减少核心时钟,关闭显示输出,关闭内存子系统,关闭各种内部子系统,如时钟发生器,甚至芯片的主要部分,如计算内核,缓存等.甚至可能是芯片的"完全"断电.现代GPU具有可控制的功率传输系统,包括片上和片外,以实现这种行为.

要反转此过程,GPU驱动程序软件必须小心(按照规定的顺序)启动模块,等待硬件建立时间,然后应用模块级复位,然后开始初始化模块中的控制寄存器.例如,加电存储器将包括打开片上DRAM控制模块,打开DRAM电源,打开存储器引脚驱动器,设置转换速率,打开存储器时钟,初始化存储器时钟发生器等. PLL用于所需的操作,并且在许多情况下,将存储器初始化为某种已知状态.例如,适当的ECC使用要求将存储器初始化为已知状态,该状态可能不仅仅是全零,而是涉及必须计算和存储的ECC标签.这个"ECC Scrub"是文档中提到的"耗时"过程的一个例子.

根据确切的电源状态,驱动程序必须执行任何操作才能使GPU进入下一个更高功率状态(或"性能状态"),P0是最高状态.一旦perf状态高于某个级别(例如,P8),则GPU可能能够支持某些类型的上下文(例如计算上下文),但可能处于降低的性能级别(除非您处于P0).

这些操作需要时间,并且持久性模式通常将GPU保持在功率/性能状态P2或P0,这意味着如果期望在GPU上打开上下文,则基本上不必执行上述步骤.

但是,打开GPU上下文可能涉及其自身的启动成本,GPU无法或不会跟踪.例如,在UVA机制中打开计算上下文需要(其中包括)请求主机操作系统的"虚拟分配",以及系统中所有处理器的内存映射(所有"可见"GPU,以及CPU) )"协调",以便每个人都有一个独特的工作空间,并且空间中64位指针的数值可用于唯一地确定该指针的"所有权"或"含义/内省".

在大多数情况下,与打开CUDA上下文相关的活动(除了将设备置于可以支持上下文的状态的过程之外)不会受到GPU处于持久模式的影响或受益.

由于设备初始化和CUDA上下文创建都可能影响感知的"CUDA启动时间",因此持久模式可以改善/减轻整体感知的启动时间,但是它不能将其减少到零,因为与上下文创建相关的一些活动在外部它的权限.

持久性模式的确切行为可能随着时间和GPU类型而变化.最近,似乎持久性模式仍然可以允许GPU向下移动到P8的功率状态.

  • 虚拟分配不是关于持久性模式的问题的一部分,它是做什么的.但是,更大的分配请求可能需要更多时间.这主要是在Linux等操作系统上发生这种情况(系统调用)的函数.是的,GPU可以积极地管理电源.一些功率状态转换(例如,P0-> P2)可能在短时间内发生.其他功率状态转换(例如P2-> P8)可能需要更长的时间,例如秒. (3认同)