簡體   English   中英

CUDA 流和上下文

[英]CUDA streams and context

我目前正在使用一個應用程序,它會產生一堆 pthreads (linux),每個線程都創建了自己的 CUDA 上下文。 (現在使用 cuda 3.2)。

我遇到的問題是,似乎每個線程都有自己的上下文,會在 GPU 上消耗大量內存。 每個線程大約 200MB,所以這真的限制了我。

我可以簡單地在主機線程中創建流,將流引用傳遞給工作線程,然后工作線程就可以將它們的流編號傳遞給我的 CUDA 庫,並且所有工作都在相同的上下文中工作嗎?

工作線程是否自動知道與其父線程相同的 CUDA 上下文?

謝謝

每個 CUDA 上下文確實會消耗相當多的設備內存,並且它們的資源彼此嚴格分區。 例如,上下文 A 中分配的設備內存不能被上下文 B 訪問。流也僅在創建它們的上下文中有效。

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

上下文推送/彈出是輕量級操作,從 CUDA 3.2 開始,它們可以在 CUDA 運行時應用程序中完成。 所以我的建議是初始化 CUDA 上下文,然后調用 cuCtxPopCurrent() 使上下文“浮動”,除非某些線程想要操作它。 將“浮動”狀態視為自然狀態 - 每當線程想要操作上下文時,將其用法與 cuCtxPushCurrent()/cuCtxPopCurrent() 括起來。

暫無
暫無

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

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