1. 程式人生 > >cudaMemGetInfo獲取的可用視訊記憶體和全部視訊記憶體有問題和實際有出入?CPU多執行緒呼叫GPU

cudaMemGetInfo獲取的可用視訊記憶體和全部視訊記憶體有問題和實際有出入?CPU多執行緒呼叫GPU

我在vs上執行cuda程式,用cudaMemGetInfo獲得的總的視訊記憶體是3g,但是實際應該有4g。可用的視訊記憶體是3028M,那就是用了44M,但是用GPU-Z和nvidia-smi都顯示用了800多M,不知道為什麼是這樣?

Tesla P100這種問題很難定量。
例如一臺有 32GB 記憶體的機器,但是在 C 裡面也沒辦法全部用上,因此作業系統會佔用一部分,至於佔用多少?這個是非常底層的事情。
同樣的,視訊記憶體並非完全留給程式碼使用,驅動層與顯示卡之間保持通訊,基本上就會長期佔用一部分,CUDA 的 Warp Manager 管理器也會長期佔用一部分,如果是 Windows 系統,可能圖形顯示功能也要長期佔用一部分。
建議您不需要太糾結與視訊記憶體的可用數量,從 CUDA 的資源呼叫來說,視訊記憶體屬於 Global Memory 是“慢速”的儲存種類,除非您計算的資料量非常之大,此時該學習一些 steal 技巧來解決吞吐瓶頸,否則糾結與視訊記憶體數量問題,會偏離您的學習重點。
問題:就是CPUpthread_create建立多個執行緒,執行GPU程式碼,會不會有問題?

[size=18.9999980926514px]答:沒有任何問題的。你的這個模型(開多個CPU執行緒,每個執行緒單獨處理1個stream上的kernel啟動或者複製任務)其實是最經典的模型。完全無任何問題的。請大膽使用。最常見的是,只有1張卡的時候,同時使用2-3個執行緒,分別建立2-3個streams,處理該GPU上的多組任務。以及,在多張卡的時候,也可以進一步的將執行緒數量擴大N倍(N是你的GPU數量),然後每2-3個執行緒對付一個GPU,這樣程式設計起來邏輯簡單,充分壓榨GPU。

(是不是一個伺服器
上2顆CPU,多核的,必須這麼用才能把機器的效能發揮到極致?
)你這個是另外一個問題了。如果具有2路CPU,每路里面有N個SMP核心,每個核心假設支援2個執行緒(超執行緒),的確是可以通過多CPU執行緒的方式,充分使用CPU的。這個是傳統的CPU上的做法。


(2各執行緒同時訪問GPU,會不會有衝突?)這要看你的具體的操作了。如果兩個stream裡的kernel操作的資料毫無關係,則可以隨意進行,如果2個stream裡的kernel*可能*同時操作一段緩衝區的位置,儘量使用原子操作保證資料操作如你所想。這是對一張卡上的來說的多卡,非pascal,在P2P Access下,多個stream裡的kernel同時操作特定某張卡的特定位置,不能用原子操作的,
而pasca(計算能力6.1),我還沒有測試過。暫時不知道結論

以及,需要說明的是,對一張卡上多個流,並不一定必須使用多個CPU執行緒的,你完全可以只使用1個執行緒,但是使用多個往往更簡潔,方便。