簡體   English   中英

多個進程並行啟動CUDA內核

[英]Multiple processes launching CUDA kernels in parallel

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

我的第一個問題是這些內核的預期行為是什么。 它們也將同時執行,還是由於它們是由不同的進程啟動的,所以它們將順序執行。

我很困惑,因為CUDA C編程指南說:

“來自一個CUDA上下文的內核不能與來自另一個CUDA上下文的內核同時執行。” 這使我想到第二個問題,什么是CUDA“上下文”?

謝謝!

CUDA上下文是一個虛擬執行空間,其中包含主機線程或進程擁有的代碼和數據。 使用所有當前硬件的GPU上只能有一個上下文處於活動狀態。

因此,要回答您的第一個問題,如果您有七個單獨的線程或進程都試圖建立上下文並同時在同一個GPU上運行,則它們將被序列化,並且將阻止所有等待訪問GPU的進程,直到擁有該線程的所有者為止。運行上下文產量。 據我所知,沒有時間划分和調度啟發式文件都沒有記錄,並且(我懷疑)在操作系統之間是不統一的。

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

您是否真的需要有單獨的線程和上下文? 我相信最佳實踐是每個GPU使用一個上下文,因為單個GPU上的多個上下文帶來了足夠的開銷。

要具體執行許多內核,您應該在一個CUDA上下文中創建幾個CUDA流,並將每個內核放入其自己的流中排隊-如果有足夠的資源,它們將同時執行。

如果需要從幾個CPU線程訪問上下文-可以使用cuCtxPopCurrent(),cuCtxPushCurrent()來傳遞它們,但是任何時候都只能有一個線程使用該上下文。

添加到@talonmies的答案

在較新的體系結構中,通過使用MPS,多個進程可以同時啟動多個內核。 因此,現在絕對有可能是以前沒有的。 有關詳細的理解,請閱讀本文。

https://docs.nvidia.com/deploy/pdf/CUDA_Multi_Process_Service_Overview.pdf

此外,您還可以查看不同GPU支持的每種cuda計算功能類型所允許的最大並發內核數。 這是一個鏈接:

https://zh.wikipedia.org/wiki/CUDA#Version_features_and_specifications

例如,具有7.5的cuda計算能力的GPU最多可以啟動128個Cuda內核。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM