在CUDA中,我們可以使用固定內存更有效地將數據從主機複製到GPU,而不是通過主機上的malloc分配的默認內存。但是,有兩種類型的固定內存默認固定內存和零複製固定內存。默認固定內存與零拷貝內存
固定內存拷貝從主機到GPU的數據快兩倍的正常傳輸,所以肯定有優勢(前提是我們有足夠的主機內存頁鎖)
在不同版本的固定默認內存,即零拷貝內存,我們不需要將數據從主機複製到GPU的DRAM。內核直接從主機內存中讀取數據。
我的問題是:哪種固定內存類型是更好的編程習慣。
在CUDA中,我們可以使用固定內存更有效地將數據從主機複製到GPU,而不是通過主機上的malloc分配的默認內存。但是,有兩種類型的固定內存默認固定內存和零複製固定內存。默認固定內存與零拷貝內存
固定內存拷貝從主機到GPU的數據快兩倍的正常傳輸,所以肯定有優勢(前提是我們有足夠的主機內存頁鎖)
在不同版本的固定默認內存,即零拷貝內存,我們不需要將數據從主機複製到GPU的DRAM。內核直接從主機內存中讀取數據。
我的問題是:哪種固定內存類型是更好的編程習慣。
我認爲這取決於你的應用程序(否則,爲什麼他們會提供兩種方式?)
映射,固定內存(零拷貝)是有用的,當兩種:
的GPU本身沒有內存,無論如何都使用RAM
您只需加載一次數據,但您需要執行大量計算,並且希望通過它來隱藏內存傳輸延遲。
主機端想改變/添加更多的數據,或者讀取結果,而內核仍在運行(如通信)
的數據不適合GPU內存
請注意,您也可以使用多個流來並行複製數據並運行內核。
牽制的,但不映射內存是更好:
當加載或數據多次存儲。例如:您有多個後續內核,分步執行工作 - 不需要每次都從主機加載數據。
沒有那麼多的計算執行和加載延遲都不會被隱藏的很好
映射固定內存等同於在各方面其他類型的固定內存的,只不過它被映射進入CUDA地址空間,因此可以由CUDA內核讀取和寫入,也可以用於複製引擎的DMA傳輸。
不映射固定內存的好處有兩個方面:它爲您節省了一些地址空間,這在可以容納3-4G內存的GPU的32位平臺的世界中可以是寶貴的商品化。此外,未映射的內存不會被流氓內核意外破壞。但是這種擔心足以讓CUDA 4中的統一地址空間功能足夠深奧。0將導致默認映射所有固定分配。
除了由桑德斯/ Kandrot本書中提出的問題,其他的事情要記住:
寫從內核主機內存(如發佈結果到了CPU)是在尼斯在這種情況下,GPU沒有任何延遲,
非常重要的是內存操作要合併 - 否則,即使SM 2.x和更高版本的GPU也會帶寬很大。
您能否擴展最後兩點?關於第一點,當你說「GPU在這種情況下沒有延遲時間」時,你是什麼意思?關於第二點,爲什麼零拷貝框架中的操作需要合併?他們是否使用全球內存? – JackOLantern 2013-05-11 20:19:18
如果GPU從映射的固定內存中讀取數據,它必須找到要做的事情,直到內存請求到達。如果寫入映射的固定內存,它將寫入總線並繼續。 我不知道爲什麼他們必須合併。合併是一種基於扭曲的構造,它必須與硬件實現有關。 – ArchaeaSoftware 2013-05-13 18:55:39
合併decxreases內存操作的數量,因此通過慢速PCI-E總線訪問的零拷貝內存變得更加重要(與GPU本身的高帶寬全局內存相比) – Bulat 2016-02-12 17:23:00
是的。我在「CUDA by example」一書中發現了幾乎相同的描述。他們聲稱,當a)內核只讀寫一次數據時,映射內存是最佳選擇。b)當您有集成顯卡時,像CPU和GPU共享相同內存的ION平臺。 – jwdmsd 2011-03-06 13:15:50