這篇日志是學習AMD OpenCL文檔時候的總結。
???? OpenCL用memory object在host和device之間傳輸數據,memory object由runtime(運行庫,driver的一部分)來管理。
??? OpenCL中的內存對象包括buffer以及image,buffer是一維數據元素的集合。image主要用來存儲一維、二維、三維圖像、紋理或者framebuffer。[對image對象,gpu會有優化,比如使用L1 cache,使用tile mode地址等等]
我們先畫一張圖,然后再來學習各種內存概念:
Host memory:
?????? 是指系統內存,cpu能夠以全速帶寬訪問系統內存,但是GPU不能直接訪問它。
Pinned host memory(page locked):
????? 是host內存的一部分,由操作系統確定它的駐留位置,它的物理地址是固定的,不能改變。runtime會限制opencl memory object使用的pinned memory數量。注:pinned memory如同名字所言,不能被交換出內存,是page locked。cpu能夠以全速帶寬訪問pinned內存,且需保持cpu cache一致性,GPU通過PCIE訪問pinned memory,也要保持cache一致性。
Device visible host memory:
????? 是pinned memory一部分,GPU訪問時可以不必保持cpu cache一致性,這樣可以加快GPU訪問速度,但由于沒有cache一致性,cpu讀這些memory就變慢了,由于可以combined write(就是通過一次內存訪問,鄰接的很多地址進行寫操作),cpu寫操作速度并不慢。
Device memory:
???? dGPU有自己的device memory,gpu可以以高帶寬進行訪問,但cpu不能直接訪問。
Host visible device memroy:
??? dGPU的一部分,GPU能夠以全速帶寬訪問它,該內存被映射到cpu地址空間,做為無cache內存,cpu可以通過PCIE直接訪問它,當然速度和system memory比,要慢好多,但是由于可以combined write(scatter write),所以寫速度取決于PCIE帶寬。
????
???? 對于APU而言,沒有單獨的global memory,它用device visible memory 做為global memory。
下面我們看下如何在system memory和device memory之間傳輸數據:
當system memory中的數據要拷貝到device memory中去的時候,OpenCL runtime執行下面的操作:
1、當傳輸數據小于32K時,cpu把數據拷貝到runtime能夠訪問的pinned memory buffer中,然后DMA engine執行相應的傳輸,相反的過程也一樣,數據從device memory傳輸到pinned memory buffer,然后copy到指定的系統內存塊中。
2、傳輸數據大于32K,小于16M時,數據的物理內存頁首先被pinned(lock page),然后DMA engine執行傳輸操作,最后內存塊被unpinned。
3、當傳輸數據大于16M時,host pinned memory的staging buffer被使用,數據分批次被拷貝到staging buffer,然后傳輸到device memory。注:會使用雙緩沖,以便DMA向device拷貝數據、cpu向stage buffer拷貝數據能夠并行執行。