CUDA C編程指南,據說CUDA:在多個設備之間共享數據?
...通過設計,主機線程只能在一個設備上,在任何給定的時間執行設備代碼。因此,需要多個主機線程才能在多個設備上執行設備代碼。此外,通過在一個主機線程運行時創建的任何CUDA資源不能由其他主機線程運行時使用......
我想要做的就是在主機(映射內存)兩個GPU共享數據,
但手冊似乎說這是不可能的。
有沒有這方面的解決方案
CUDA C編程指南,據說CUDA:在多個設備之間共享數據?
...通過設計,主機線程只能在一個設備上,在任何給定的時間執行設備代碼。因此,需要多個主機線程才能在多個設備上執行設備代碼。此外,通過在一個主機線程運行時創建的任何CUDA資源不能由其他主機線程運行時使用......
我想要做的就是在主機(映射內存)兩個GPU共享數據,
但手冊似乎說這是不可能的。
有沒有這方面的解決方案
解決方案是手動管理這些常用數據。即使使用SLI。
卡片在SLI模式下確實沒有共享內存 - 共享數據必須通過總線從一個複製到另一個。
你可能想看看GMAC。這是一個建立在CUDA之上的庫,可以讓人感受到共享內存的錯覺。它實際上做的是在主機和GPU設備上的相同虛擬地址處分配內存,並使用頁面保護按需傳輸數據。請注意,這有點實驗性,可能在beta測試階段。
當你分配主機的內存,您應該分配使用cudaHostAlloc()
並通過cudaHostAllocPortable
標誌。這將允許多個CUDA上下文訪問內存。
你想通過傳遞cudaHostAllocPortable
到cudaHostAlloc()
分配您的固定內存爲便攜式。您可以在同一固定內存的設備之間在內核之外交換數據,正如我之前所做的那樣。至於映射的內存,我不太確定,但我不明白爲什麼你不能。嘗試使用cudaHostGetDevicePointer()
獲取用於當前設備(與同一CPU線程關聯的設備)的設備指針。
CUDA編程指南(v3.2)第3.2.5.3節中有更多信息:
頁面鎖定主機存儲器的塊可被分配爲兩個映射和便攜式(見第3.2.5.1),在這種情況下,需要每個主機線程塊映射到其設備地址空間必須調用cudaHostGetDevicePointer ()來檢索設備指針,因爲設備指針通常會從一個主機線程到另一個主機線程不同。
我曾專門問關於如何兩顆GPU之間的數據傳輸,並有receieved迴應說,如果你想使用同時兩個GPU和傳輸數據之間,必須有兩個線程對NVIDIA論壇類似的問題(如手冊所示)。該手冊說「CUDA資源」不能共享,但是它們從中複製的主機內存可以共享(使用openmp或mpi)。因此,如果您將內存從每個設備傳回主機,則可以訪問設備之間的內存。
請記住,這將是非常緩慢的,因爲從/向設備傳輸內存將非常緩慢。
所以,不,你不能從gpu2訪問gpu1內存(即使是sli--我一直被大吼大叫因爲與cuda沒有任何關係)。然而,你可以把gpu1寫入主機上的一個區域,然後把gpu2寫入另一個區域,並允許管理每個設備的線程將必要的數據寫回正確的gpu。
爲什麼要使用MPI。他說,他有多個GPU的不是主機 – user567879 2013-09-06 07:18:07