2011-03-06 79 views
26

在CUDA中,我們可以使用固定內存更有效地將數據從主機複製到GPU,而不是通過主機上的malloc分配的默認內存。但是,有兩種類型的固定內存默認固定內存零複製固定內存默認固定內存與零拷貝內存

固定內存拷貝從主機到GPU的數據快兩倍的正常傳輸,所以肯定有優勢(前提是我們有足夠的主機內存頁鎖)

在不同版本的固定默認內存,即零拷貝內存,我們不需要將數據從主機複製到GPU的DRAM。內核直接從主機內存中讀取數據。

我的問題是:哪種固定內存類型是更好的編程習慣。

回答

29

我認爲這取決於你的應用程序(否則,爲什麼他們會提供兩種方式?)

映射,固定內存(零拷貝)是有用的,當兩種:

  • 的GPU本身沒有內存,無論如何都使用RAM

  • 您只需加載一次數據,但您需要執行大量計算,並且希望通過它來隱藏內存傳輸延遲。

  • 主機端想改變/添加更多的數據,或者讀取結果,而內核仍在運行(如通信)

  • 的數據不適合GPU內存

請注意,您也可以使用多個流來並行複製數據並運行內核。

牽制的,但不映射內存是更好:

  • 當加載或數據多次存儲。例如:您有多個後續內核,分步執行工作 - 不需要每次都從主機加載數據。

  • 沒有那麼多的計算執行和加載延遲都不會被隱藏的很好

+0

是的。我在「CUDA by example」一書中發現了幾乎相同的描述。他們聲稱,當a)內核只讀寫一次數據時,映射內存是最佳選擇。b)當您有集成顯卡時,像CPU和GPU共享相同內存的ION平臺。 – jwdmsd 2011-03-06 13:15:50

11

映射固定內存等同於在各方面其他類型的固定內存的,只不過它被映射進入CUDA地址空間,因此可以由CUDA內核讀取和寫入,也可以用於複製引擎的DMA傳輸。

不映射固定內存的好處有兩個方面:它爲您節省了一些地址空間,這在可以容納3-4G內存的GPU的32位平臺的世界中可以是寶貴的商品化。此外,未映射的內存不會被流氓內核意外破壞。但是這種擔心足以讓CUDA 4中的統一地址空間功能足夠深奧。0將導致默認映射所有固定分配。

除了由桑德斯/ Kandrot本書中提出的問題,其他的事情要記住:

  • 寫從內核主機內存(如發佈結果到了CPU)是在尼斯在這種情況下,GPU沒有任何延遲,

  • 非常重要的是內存操作要合併 - 否則,即使SM 2.x和更高版本的GPU也會帶寬很大。

+0

您能否擴展最後兩點?關於第一點,當你說「GPU在這種情況下沒有延遲時間」時,你是什麼意思?關於第二點,爲什麼零拷貝框架中的操作需要合併?他們是否使用全球內存? – JackOLantern 2013-05-11 20:19:18

+1

如果GPU從映射的固定內存中讀取數據,它必須找到要做的事情,直到內存請求到達。如果寫入映射的固定內存,它將寫入總線並繼續。 我不知道爲什麼他們必須合併。合併是一種基於扭曲的構造,它必須與硬件實現有關。 – ArchaeaSoftware 2013-05-13 18:55:39

+0

合併decxreases內存操作的數量,因此通過慢速PCI-E總線訪問的零拷貝內存變得更加重要(與GPU本身的高帶寬全局內存相比) – Bulat 2016-02-12 17:23:00