2011-07-25 52 views
5

我使用目前的應用程序,它會生成一串並行線程的(Linux版),每一類又創建了它自己的CUDA上下文。 (現在使用cuda 3.2)。CUDA流和上下文

我遇到的問題是,它好像每個線程有自己的上下文花費大量內存的GPU。每個線程200MB,所以這真的限制了我。

我可以簡單地創建在主線程流,通過流參考工作線程,那麼這將是能夠傳遞給我的CUDA庫中的數據流編號,而所有的工作了同樣的情況下呢?

做了工作線程自動知道同一CUDA上下文,因爲它的父線程?

感謝

回答

6

每個CUDA上下文並花費相當多的設備內存,它們的資源嚴格彼此隔開。例如,上下文A中分配的設備內存無法通過上下文B訪問。流也僅在創建它們的上下文中有效。

最佳做法是爲每個設備創建一個CUDA上下文。默認情況下,只能從創建它的CPU線程訪問該CUDA上下文。如果要從其他線程訪問CUDA上下文,請調用cuCtxPopCurrent()以從創建它的線程中彈出它。然後可以將上下文推送到任何其他CPU線程的當前上下文堆棧上,隨後的CUDA調用將引用該上下文。

語境推/彈出重量輕操作和CUDA 3.2,他們可以在CUDA運行的應用程序來完成。所以我的建議是初始化CUDA上下文,然後調用cuCtxPopCurrent()使上下文「浮動」,除非有些線程想要操作它。考慮「浮動」狀態是自然的 - 每當一個線程想要操縱上下文時,用cuCtxPushCurrent()/ cuCtxPopCurrent()括起它的用法。

+0

沒有一個PopCurrent()實際上從保存上下文的「隊列」中刪除它,所以它不給其他線程訪問?我可以從主機線程中彈出當前上下文,只是將該上下文傳遞給工作線程,並將其「推」到上下文堆棧中?聽起來像上下文將必須在一個「併發隊列」,並有一個互斥體,對吧? – Derek

+0

當創建一個上下文時,它會被推送到當前上下文棧中。彈出上下文會導致它不能被任何CPU線程使用,直到它被cuCtxPushCurrent()壓入另一個當前上下文堆棧。所以你描述的工作流程正是API設計的目的。 上下文是線程安全的,因此您需要實現的唯一附加線程同步將是執行應用程序所需的排序或其他語義。 – ArchaeaSoftware

+0

我爲每個線程使用'cuCtxSetCurrent(CUcontext ctx)'。這是否需要一些東西讓它走,類似於推後的彈出,當線程不再需要上下文? –