2013-02-15 153 views
10

我知道具有計算能力2.x或更高的NVIDIA gpus可以同時執行16個內核。 但是,我的應用程序產生了7個「進程」,並且這7個進程中的每一個都啓動了CUDA內核。多個進程並行啓動CUDA內核

我的第一個問題是,這些內核的預期行爲是什麼。它們是否會同時執行,或者由於它們是由不同進程啓動的,它們將按順序執行。

我很困惑,因爲CUDA C語言編程指南說:

「從一個CUDA上下文內核不能同時從另一個方面CUDA內核執行。」 這讓我回到第二個問題,CUDA的「背景」是什麼?

謝謝!

回答

14

CUDA上下文是一個虛擬執行空間,用於存放主機線程或進程擁有的代碼和數據。使用所有當前硬件,只有一個上下文可以在GPU上處於活動狀態。因此,要回答你的第一個問題,如果你有七個獨立的線程或進程都試圖建立一個上下文並同時在同一個GPU上運行,它們將被序列化,等待訪問GPU的任何進程將被阻塞,直到正在運行的上下文的所有者產生。據我所知,沒有時間分割和調度啓發式沒有記錄,並且(我懷疑)從操作系統到操作系統是不統一的。

您最好啓動一個擁有GPU上下文的單個工作線程,並使用來自其他線程的消息將工作推送到GPU上。或者,CUDA驅動程序API中提供了一個上下文遷移工具,但該工具僅適用於來自同一進程的線程,並且遷移機制具有延遲和主機CPU開銷。

0

你真的需要單獨的線程和上下文嗎? 我認爲最佳實踐是每個GPU使用一個上下文,因爲單個GPU上的多個上下文會帶來足夠的開銷。

要執行許多內核concrurrenlty,您應該在一個CUDA上下文中創建少量CUDA流,並將每個內核排隊到它自己的流中 - 這樣,如果有足夠的資源,它們將被併發執行。

如果您需要使用少量CPU線程訪問上下文,您可以使用cuCtxPopCurrent(),cuCtxPushCurrent()來傳遞它們,但只有一個線程可以隨時使用上下文。

+0

您是否確認多個上下文可以在單個GPU上同時處於活動狀態? – Tariq 2014-07-15 09:50:12

+0

@Tariq,我沒有說明)我可以確認你可以同時在一個GPU上運行兩個程序,但是我不知道它們是否都是主動的,或者驅動程序會以某種方式交替工作。 – ShPavel 2014-10-28 18:39:02

+0

http://stackoverflow.com/questions/31643570/running-more-than-one-cuda-applications-on-one-gpu – pgoetz 2017-03-31 16:06:46