2010-11-10 60 views
3

CUDA C編程指南,據說CUDA:在多個設備之間共享數據?

...通過設計,主機線程只能在一個設備上,在任何給定的時間執行設備代碼。因此,需要多個主機線程才能在多個設備上執行設備代碼。此外,通過在一個主機線程運行時創建的任何CUDA資源不能由其他主機線程運行時使用......

我想要做的就是在主機(映射內存)兩個GPU共享數據,
但手冊似乎說這是不可能的。
有沒有這方面的解決方案

回答

1

你可能想看看GMAC。這是一個建立在CUDA之上的庫,可以讓人感受到共享內存的錯覺。它實際上做的是在主機和GPU設備上的相同虛擬地址處分配內存,並使用頁面保護按需傳輸數據。請注意,這有點實驗性,可能在beta測試階段。

http://code.google.com/p/adsm/

3

當你分配主機的內存,您應該分配使用cudaHostAlloc()並通過cudaHostAllocPortable標誌。這將允許多個CUDA上下文訪問內存。

0

你想通過傳遞cudaHostAllocPortablecudaHostAlloc()分配您的固定內存爲便攜式。您可以在同一固定內存的設備之間在內核之外交換數據,正如我之前所做的那樣。至於映射的內存,我不太確定,但我不明白爲什麼你不能。嘗試使用cudaHostGetDevicePointer()獲取用於當前設備(與同一CPU線程關聯的設備)的設備指針。

CUDA編程指南(v3.2)第3.2.5.3節中有更多信息:

頁面鎖定主機存儲器的塊可被分配爲兩個映射和便攜式(見第3.2.5.1),在這種情況下,需要每個主機線程塊映射到其設備地址空間必須調用cudaHostGetDevicePointer ()來檢索設備指針,因爲設備指針通常會從一個主機線程到另一個主機線程不同。

0

我曾專門問關於如何兩顆GPU之間的數據傳輸,並有receieved迴應說,如果你想使用同時兩個GPU和傳輸數據之間,必須有兩個線程對NVIDIA論壇類似的問題(如手冊所示)。該手冊說「CUDA資源」不能共享,但是它們從中複製的主機內存可以共享(使用openmp或mpi)。因此,如果您將內存從每個設備傳回主機,則可以訪問設備之間的內存。

請記住,這將是非常緩慢的,因爲從/向設備傳輸內存將非常緩慢。

所以,不,你不能從gpu2訪問gpu1內存(即使是sli--我一直被大吼大叫因爲與cuda沒有任何關係)。然而,你可以把gpu1寫入主機上的一個區域,然後把gpu2寫入另一個區域,並允許管理每個設備的線程將必要的數據寫回正確的gpu。