OpenCL2.0特性之SVM
from: http://blog.csdn.net/hdanbang/article/details/50198415
在OpenCL2.0中,增加了SVM(shared virtual memory)的特性。在開始講解SVM之前,我們先用圖片來看下OpenCL1.2中主機與設備端的地址空間:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖1 OpenCL1.2中主機與設備端地址空間
? ? ? ? 從圖1可以看到,主機與設備具有不同的地址空間,各自需要對各自的內存進行管理。彼此之間不能直接訪問對方的地址空間。所以,兩者之間數據需要通信的話,只能把數據在主機與設備間來回拷貝,或者把設備端地址空間map /unmap到主機端。對于這樣一種模式下,如果我們要想在設備端處理主機端的鏈表、樹之類的數據。我們只能鞭長莫及!對于異構平臺,我們就真的沒辦法愉快地處理鏈表之類的數據么?技術是發展的,有需求就必有技術來解決!
? ? ?從CUDA6以后,GPU與CPU之間支持統一尋址(Unified Memory) ?,GPU與CPU間可以直接訪問彼此的地址空間,不需要我們人為的數據拷貝。這給異構計算又帶入了一個新的高度,我們可以處理鏈表數據啦!既然CUDA都開始支持了,OpenCL也不能落后呀。在OpenCL2.0中,增加了共享虛擬內存(shared virtual memory),我們還是以一張圖片來形象的描述:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖2?OpenCL2.0中主機與設備端地址空間
? ? ? 從圖2可以看到,圖1中原來兩個彼此不相交的地址空間現在有個公共交集,這個公共交集就是SVM.。對于SVM的地址空間,主機和設備都可以直接訪問,媽媽再也不用擔心異構平臺的數據訪問方式了!
說完了SVM的意義,我們來聊聊SVM的具體細節。
? ? ? ? 對于SVM的創建,OpenCL2.0中有兩種方式,一種緩沖分配(buffer allocation),另一種是系統分配(System allocation):
? ? ? ? 1、所謂緩沖分配,就是我們使用OpenCL API函數clSVMAlloc來分配,然后使用clSetKernelArgSVMPointer把分配的SVM作為內核參數傳入
? ? ? ? ?2、所謂系統分配,就是在主機端,我們可以使用malloc,new之類的系統分配內存函數來分配空間,然后使用clSetKernelArgSVMPointer把分配的SVM作為內核參數傳入。
? ? ? ? 對于SVM的類型,OpenCL2.0也是有兩種類型:一種是粗粒度;另一種是細粒度:
? ? ? ? 1、粗粒度SVM:共享發生在OpenCL緩沖內存對象區域粒度。在同步點強制內存一致性,使用map/unmap命令來更新主機與設備間的數據。粗粒度的SVM與OpenCL1.2中使用緩沖對象類似,不過唯一不同的是:我們不需要來回拷貝數據,設備與主機可以直接訪問對方的數據,這才是重點!
? ? ? ?2、所謂細粒度SVM:共享發生在OpenCL緩沖對象單個的加載/存儲粒度。內存一致性在同步點得到保證。
? ? ? ? 好,結合SVM分配方式和SVM類型,可以把OpenCL2.0中的SVM分為:粗粒度緩沖SVM,細粒度緩沖SVM,細粒度系統SVM。(木有粗粒度系統SVM)。對于你的OpenCL設備(請確保你的設備支持OpenCL2.0),到底支持上述三種的哪三種呢?我們可以通過如下代碼查詢:
? ? ? ? ?
[cpp] view plaincopy
[html] view plaincopy
? ? ? 粗粒度緩沖SVM和細粒度緩沖SVM大致用法,如下表格所示
| [cpp] view plaincopy | [cpp] view plaincopy |
具體的SVM例子,請移步這里。
OpenCL2.0 SVM的講解,就到這吧!
?ps:最后嘮叨一句:對于SVM,方便了我們碼農編程,從硬件上來說,OpenCL設備與主機不一定是共享物理內存的。
總結
以上是生活随笔為你收集整理的OpenCL2.0特性之SVM的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 详细程序注解学OpenCL一 环境配置和
- 下一篇: CSDN技术主题月----“深度学习”代