有2個主要部分在GPU/CUDA啓動順序:
- 設備初始化時間
- CUDA上下文 「懶惰」 初始化
現代CUDA GPU可以在存在其中幾個power states。當前的電源狀態可通過nvidia-smi
或NVML或通過NVML觀察到(但請注意,運行像nvidia-smi
這樣的工具的效果可能會改變GPU的電源狀態。)當GPU未用於任何目的時(即,它在技術上處於空閒狀態:GPU上沒有實例化任何類型的上下文)並且未啓用持久性模式,GPU與GPU驅動程序配合使用時會自動將其電源狀態降至非常低的水平,有時還包括完整的場景。
將GPU移至低功耗狀態的過程將涉及關閉或修改各種硬件的行爲。例如,減少內存時鐘,減少內核時鐘,關閉顯示輸出,關閉內存子系統,關閉各種內部子系統(如時鐘發生器),甚至關閉芯片的主要部分,如計算內核,高速緩存等。甚至可能是芯片「完全」掉電。現代GPU具有可控電源傳輸系統,無論是片上還是片外,都可以實現這種行爲。爲了逆轉這一過程,GPU驅動程序軟件必須小心地(按照規定的順序)給模塊上電,等待硬件建立時間,然後應用模塊級復位,然後開始初始化模塊中的控制寄存器。例如,啓動內存將涉及開啓片上DRAM控制模塊,打開DRAM電源,打開內存引腳驅動器,設置壓擺率,打開內存時鐘,初始化內存時鐘發生器PLL用於所需的操作,並且在許多情況下,將存儲器初始化爲某種已知狀態。例如,正確的ECC使用要求將存儲器初始化爲已知狀態,該狀態可能並非全是零,而是涉及必須計算和存儲的ECC標籤。這種「ECC擦洗」是documentation中提到的「耗時」過程的一個示例。
根據確切的電源狀態,驅動程序必須採取任何數量的操作才能使GPU進入下一個更高功耗狀態(或「性能狀態」),P0爲最高狀態。一旦perf狀態高於一定的水平(比如說P8),那麼GPU可能能夠支持某些類型的上下文(例如計算上下文),但可能在性能水平降低的情況下(除非你在P0上)。
這些操作需要時間,並且持久性模式通常會保持GPU處於power/perf狀態P2或P0,這意味着如果希望在GPU上打開上下文,則基本上不需要執行上述任何步驟。
但是,打開GPU上下文可能會涉及其自身的啓動成本,而GPU無法或無法跟蹤啓動成本。例如,打開UVA regime中的計算上下文需要主機操作系統請求「虛擬分配」,以及系統中所有處理器(所有「可見」GPU以及CPU)的內存映射,被「協調一致」,這樣每個人都有獨特的工作空間,並且空間中64位指針的數值可以用來唯一確定該指針的「所有權」或「意義/內省」。
大多數情況下,通過使GPU處於持久性模式,與打開CUDA上下文相關的活動(除了將設備置於可支持上下文的狀態的過程之外)不會受到影響或受益。由於設備初始化和CUDA上下文創建都可能影響感知的「CUDA啓動時間」,因此持久性模式可以改善/減輕整體感知的啓動時間,但是它不能將其減少到零,因爲一些活動與上下文創建不在其範圍之內。
您是否閱讀過任何[文檔](http://docs.nvidia.com/deploy/driver-persistence/index.html)? –
@RobertCrovella:見編輯。 – einpoklum