在新創建的進程中初始化CUDA可能需要相當長的時間as long as a half-second或更多在今天的許多服務器級機器上。作爲@RobertCrovella explains,CUDA初始化通常包括建立統一內存模型,該模型涉及協調設備和主機內存映射。對於擁有大量內存的機器來說,這可能需要相當長的時間;並且可能還有其他因素導致這種長時間的延遲。如何緩解CUDA非常長的初始化延遲?
當你想運行一系列不使用複雜虛擬內存映射的CUDA利用進程時,這種效果變得非常煩人:它們每個都必須等待它們長時間的等待 - 儘管「基本上」可以重新使用是否最後一次初始化CUDA(可能需要一些清理代碼)。
現在,很明顯,如果您以某種方式重寫所有這些進程的代碼以在單個進程內執行 - 這將爲您節省很長的初始化成本。但是沒有更簡單的方法嗎?如何:
- 在進程之間傳遞相同的狀態信息/ CUDA上下文?
- 告訴CUDA完全忽略大部分主機內存?
- 使統一內存協調比現在更加懶惰,以至於它只發生在實際需要的程度上?
- 啓用統一內存禁用的CUDA?
- 保持一側守護進程並鎖定到已經初始化的CUDA狀態?
嗯,聽起來有點重量級和開銷載貨。我一直都不想做IPC ......但是那是FOSS?也許人們只能把低層和黑客結合起來,成爲一個更簡單的選擇。 – einpoklum
這是NVIDIA提供的代碼庫。我期望它是封閉的來源。 – talonmies
MPS是封閉源代碼。另一種可能在某些情況下爲具有多個GPU的機器提供緩解的方法是通過'CUDA_VISIBLE_DEVICES' [環境變量](http://docs.nvidia.com/cuda)限制CUDA運行時僅使用必要的GPU /cuda-c-programming-guide/index.html#env-vars)。這可以按每個進程指定。這種方法也可能在某些pre-Pascal UM場景中提供一些好處。 –