2017-02-17 41 views
0

在新創建的進程中初始化CUDA可能需要相當長的時間as long as a half-second或更多在今天的許多服務器級機器上。作爲@RobertCrovella explains,CUDA初始化通常包括建立統一內存模型,該模型涉及協調設備和主機內存映射。對於擁有大量內存的機器來說,這可能需要相當長的時間;並且可能還有其他因素導致這種長時間的延遲。如何緩解CUDA非常長的初始化延遲?

當你想運行一系列不使用複雜虛擬內存映射的CUDA利用進程時,這種效果變得非常煩人:它們每個都必須等待它們長時間的等待 - 儘管「基本上」可以重新使用是否最後一次初始化CUDA(可能需要一些清理代碼)。

現在,很明顯,如果您以某種方式重寫所有這些進程的代碼以在單個進程內執行 - 這將爲您節省很長的初始化成本。但是沒有更簡單的方法嗎?如何:

  • 在進程之間傳遞相同的狀態信息/ CUDA上下文?
  • 告訴CUDA完全忽略大部分主機內存?
  • 使統一內存協調比現在更加懶惰,以至於它只發生在實際需要的程度上?
  • 啓用統一內存禁用的CUDA?
  • 保持一側守護進程並鎖定到已經初始化的CUDA狀態?

回答

2

你在問什麼已經存在。它被稱爲MPS(MULTI-PROCESS SERVICE),它基本上保持單個GPU上下文始終處於活動狀態,並使用模擬驅動程序API的守護程序進程。最初的目標應用程序是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

+0

嗯,聽起來有點重量級和開銷載貨。我一直都不想做IPC ......但是那是FOSS?也許人們只能把低層和黑客結合起來,成爲一個更簡單的選擇。 – einpoklum

+0

這是NVIDIA提供的代碼庫。我期望它是封閉的來源。 – talonmies

+1

MPS是封閉源代碼。另一種可能在某些情況下爲具有多個GPU的機器提供緩解的方法是通過'CUDA_VISIBLE_DEVICES' [環境變量](http://docs.nvidia.com/cuda)限制CUDA運行時僅使用必要的GPU /cuda-c-programming-guide/index.html#env-vars)。這可以按每個進程指定。這種方法也可能在某些pre-Pascal UM場景中提供一些好處。 –