OpenCL memory object 之 Global memory (1)
這篇日志是學(xué)習(xí)AMD OpenCL文檔時候的總結(jié)。
???? OpenCL用memory object在host和device之間傳輸數(shù)據(jù),memory object由runtime(運行庫,driver的一部分)來管理。
??? OpenCL中的內(nèi)存對象包括buffer以及image,buffer是一維數(shù)據(jù)元素的集合。image主要用來存儲一維、二維、三維圖像、紋理或者framebuffer。[對image對象,gpu會有優(yōu)化,比如使用L1 cache,使用tile mode地址等等]
我們先畫一張圖,然后再來學(xué)習(xí)各種內(nèi)存概念:
Host memory:
?????? 是指系統(tǒng)內(nèi)存,cpu能夠以全速帶寬訪問系統(tǒng)內(nèi)存,但是GPU不能直接訪問它。
Pinned host memory(page locked):
????? 是host內(nèi)存的一部分,由操作系統(tǒng)確定它的駐留位置,它的物理地址是固定的,不能改變。runtime會限制opencl memory object使用的pinned memory數(shù)量。注:pinned memory如同名字所言,不能被交換出內(nèi)存,是page locked。cpu能夠以全速帶寬訪問pinned內(nèi)存,且需保持cpu cache一致性,GPU通過PCIE訪問pinned memory,也要保持cache一致性。
Device visible host memory:
????? 是pinned memory一部分,GPU訪問時可以不必保持cpu cache一致性,這樣可以加快GPU訪問速度,但由于沒有cache一致性,cpu讀這些memory就變慢了,由于可以combined write(就是通過一次內(nèi)存訪問,鄰接的很多地址進行寫操作),cpu寫操作速度并不慢。
Device memory:
???? dGPU有自己的device memory,gpu可以以高帶寬進行訪問,但cpu不能直接訪問。
Host visible device memroy:
??? dGPU的一部分,GPU能夠以全速帶寬訪問它,該內(nèi)存被映射到cpu地址空間,做為無cache內(nèi)存,cpu可以通過PCIE直接訪問它,當(dāng)然速度和system memory比,要慢好多,但是由于可以combined write(scatter write),所以寫速度取決于PCIE帶寬。
????
???? 對于APU而言,沒有單獨的global memory,它用device visible memory 做為global memory。
下面我們看下如何在system memory和device memory之間傳輸數(shù)據(jù):
當(dāng)system memory中的數(shù)據(jù)要拷貝到device memory中去的時候,OpenCL runtime執(zhí)行下面的操作:
1、當(dāng)傳輸數(shù)據(jù)小于32K時,cpu把數(shù)據(jù)拷貝到runtime能夠訪問的pinned memory buffer中,然后DMA engine執(zhí)行相應(yīng)的傳輸,相反的過程也一樣,數(shù)據(jù)從device memory傳輸?shù)絧inned memory buffer,然后copy到指定的系統(tǒng)內(nèi)存塊中。
2、傳輸數(shù)據(jù)大于32K,小于16M時,數(shù)據(jù)的物理內(nèi)存頁首先被pinned(lock page),然后DMA engine執(zhí)行傳輸操作,最后內(nèi)存塊被unpinned。
3、當(dāng)傳輸數(shù)據(jù)大于16M時,host pinned memory的staging buffer被使用,數(shù)據(jù)分批次被拷貝到staging buffer,然后傳輸?shù)絛evice memory。注:會使用雙緩沖,以便DMA向device拷貝數(shù)據(jù)、cpu向stage buffer拷貝數(shù)據(jù)能夠并行執(zhí)行。
總結(jié)
以上是生活随笔為你收集整理的OpenCL memory object 之 Global memory (1)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IOS开发基础之微博项目第1天-OC版
- 下一篇: 100个经典的C语言算法