2013-05-18 55 views
1

是否可以在使用相同GPU的不同上下文(CPU線程)之間共享cudaMalloc的GPU緩衝區?每個上下文分配一個輸入緩衝區,需要由預處理內核填充,該內核將使用整個GPU,然後將輸出分配給它們。在不同的CUDA上下文中共享GPU緩衝區

這種場景非常適合避免多個數據傳入和傳出GPU。該應用程序是一個波束形成器,它將組合多個天線信號並生成多個波束,其中每個波束將由不同的GPU環境處理。梁的整個處理流程已經到位,我只需要添加波束形成部分。讓每個線程生成它自己的光束將複製輸入數據,所以我想避免這種情況(同時,一次生成多個光束效率更高)。

回答

3

每個CUDA上下文都有自己的虛擬內存空間,因此您不能在另一個上下文中使用來自一個上下文的指針。

這就是說,從CUDA 4.0默認情況下,每個進程創建一個上下文,而不是每個線程。如果您有多個線程運行相同的CUDA上下文,那麼在線程之間共享設備指針應該沒有問題。

0

我不認爲多個線程可以使用相同的CUDA上下文運行。我已經做了實驗,父cpu線程創建一個上下文,然後fork一個子線程。子線程將使用由父線程創建的上下文(cuCtxPushCurrent(ctx))來啓動內核。該計劃只是掛在那裏。

+0

如果通過分叉來表示OS進程分叉函數,那麼您就會混淆線程和進程。 'fork()'創建一個新進程,並且一個上下文不能在兩個進程之間共享。但是,可以在同一進程中的兩個CPU線程之間共享上下文。看看[這裏](http://stackoverflow.com/questions/22950047/cuda-intialization-error-after-fork/22950549?s=1|3.2403#22950549) –

+0

你是對的。問題是由fork()引起的。 – 770966796