启动CUDA运行时需要一定的时间来协调设备和主机的UVM内存映射;见:
现在,有人向我建议使用Persistence Mode可以显着减轻这种现象。以什么方式?我的意思是,当启用持久性模式时,会发生什么,或者不会发生什么,并且存在使用CUDA的进程?
文档说:
持久性模式是用户可设置的驱动程序属性的术语,即使没有客户端连接到目标GPU,也会保持目标GPU的初始化。
但是 - "保持初始化"意思?稍后,关于持久性守护进程的部分(与持久性模式不同)说:
只要一个或多个客户端打开了设备文件,GPU状态就会保持在驱动程序中。一旦所有客户端关闭了设备文件,除非启用持久性模式,否则将卸载GPU状态。
那么究竟卸载了什么?到哪里卸货?它与内存大小有什么关系?如果系统上没有任何重大事件发生,为什么要花这么多时间来加载呢?
答案 0 :(得分:9)
GPU / CUDA启动序列有两个主要部分:
现代CUDA GPU可以存在于多个power states中的一个中。可以通过nvidia-smi
或NVML观察当前的电源状态(但请注意,运行像nvidia-smi
这样的工具的效果可能会修改GPU的电源状态。)当GPU不是时用于任何目的(即它是空闲的,技术上:没有任何类型的上下文在GPU上实例化)并且未启用持久性模式,GPU与GPU驱动程序一致,将自动将其电源状态降低到非常高低级别,有时包括完整的power-off方案。
将GPU移动到较低功率状态的过程将涉及关闭或修改各种硬件的行为。例如,减少内存时钟,减少核心时钟,关闭显示输出,关闭内存子系统,关闭各种内部子系统,如时钟发生器,甚至芯片的主要部分,如计算内核,缓存等。甚至可能是一个完整的"芯片掉电。现代GPU具有可控制的功率传输系统,包括片上和片外,以实现这种行为。
要反转此过程,GPU驱动程序软件必须小心(按照规定的顺序)启动模块,等待硬件建立时间,然后应用模块级复位,然后开始初始化模块中的控制寄存器。例如,加电存储器将涉及开启片上DRAM控制模块,打开DRAM电源,打开存储器引脚驱动器,设置转换速率,打开存储器时钟,初始化存储器时钟发生器等。 PLL用于所需的操作,并且在许多情况下,将存储器初始化为某种已知状态。例如,适当的ECC使用要求将存储器初始化为已知状态,该状态可能不仅仅是全零,而是涉及必须计算和存储的ECC标签。这个" ECC Scrub"是一个耗时"的例子。 documentation中提到的过程。
根据确切的电源状态,驱动程序必须执行任何操作才能使GPU进入下一个更高功率状态(或者#34;性能状态"),P0是最高状态。一旦perf状态高于某个级别(例如,P8),则GPU可能能够支持某些类型的上下文(例如计算上下文),但可能处于降低的性能级别(除非您处于P0)。
这些操作需要时间,并且持久模式通常会使GPU保持在电源/性能状态P2或P0,这意味着如果希望在GPU上打开上下文,则必须执行上述步骤。< / p>
然而,打开GPU上下文可能涉及其自身的启动成本,GPU无法或不会跟踪。例如,在UVA regime中打开计算上下文需要进行“虚拟分配&#34;请求主机操作系统,并且系统中所有处理器的存储器映射(所有&#34;可见&#34; GPU,加上CPU)将被协调和#34;这样每个人都有一个独特的工作空间,并且空间中64位指针的数值可以用来唯一地确定&#34;所有权&#34;或&#34;意义/内省&#34;那个指针。
在大多数情况下,与打开CUDA上下文相关的活动(除了将设备置于可以支持上下文的状态的过程之外)不会因GPU处于持久模式而受到影响或受益。
由于设备初始化和CUDA上下文创建都可能影响感知&#34; CUDA启动时间&#34;,因此持久模式可以改善/减轻整体感知的启动时间,但它不能将其减少到零,因为与上下文创建相关的一些活动超出了其范围。
持久性模式的确切行为可能会随着时间和GPU类型而变化。最近,似乎持久性模式仍然可以允许GPU向下移动到P8的电源状态。