2013-10-21 35 views
1

我們有一個多GPU架構(在Windows上),其中可以指定'作業'(這也指定他們應該在哪個GPU上完成),然後在特定的GPU上執行。 目前,我們的方法是在框架的啓動我們爲每個GPU創建一個「工作線程」,然後等待作業被處理。具體而言,我們使用「GPUWorker」類從https://devtalk.nvidia.com/search/more/sitecommentsearch/GPUworker/好的策略多GPU處理與CPU線程,cuda上下文創建開銷

它可以很好地,到目前爲止,但有一些嚴重的性能相關的缺點:

  • 在我們frameowrk,特定的GPU被鎖定的全部時間即使GPU只在50%的工作時間內實際使用,也是「工作」的一部分。注意作業具有非常粗糙的粗糙度,例如'做光流計算',其可以採取例如50 - 100毫秒。

  • 人們不能具體的「異步」的工作(例如一個aysnchronous主機設備拷貝),它不鎖GPU

所以我現在想對這個問題「好」的策略。 我的想法如下:對於'已啓動'的每個新作業,我創建一個新的'臨時'CPU線程。 CPU線程然後設置將在其上完成工作的GPU的設備編號(通過'cudaSetDevice')。我想在這個時候(對我來說很簡單,就是創建一個Cuda環境,在發佈正確的設備之後,作業的'doWork'功能由CPU線程執行,取決於作業是同步的還是異步的,一個「加入」完成(等待CPU線程完成)或不

我現在有幾個問題:

  • 那是一個「好」的策略,或者是否有人知道的更好當然這應該是一個線程安全的策略

  • 在我提出的策略中,典型的是什麼新CPU線程創建的開銷(以毫秒爲單位)以及Cuda上下文的(隱藏)創建)?此外,如果例如Cuda上下文的創建是有意義的,有沒有辦法(例如使用cuda設備api和某種'上下文遷移')來減少這種開銷?

回答

1

您的第一種方法聽起來比您正在考慮的替代方案更有前途。

創建CPU線程並初始化CUDA上下文非常昂貴,而且要使該操作更快,這很難做到。 NVIDIA有意將大量操作前置到上下文創建過程中,所以您不會因資源分配失敗而導致意外的延遲或故障。

最好的選擇是投資異步。沒有CPU/GPU併發性,你肯定會在表上留下性能,因爲你沒有隱藏內置在CUDA驅動程序中的CPU開銷。