日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

OpenCL2.0特性之SVM

發布時間:2025/7/25 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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
  • ????????cl_device_svm_capabilities?svm;??
  • clGetDeviceInfo(*device,CL_DEVICE_SVM_CAPABILITIES,sizeof(svm),&svm,NULL);??
  • if(svm&CL_DEVICE_SVM_FINE_GRAIN_SYSTEM)??
  • ????printf("CL_DEVICE_SVM_FINE_GRAIN_SYSTEM\n");??
  • if(svm&CL_DEVICE_SVM_FINE_GRAIN_BUFFER)??
  • ????printf("CL_DEVICE_SVM_FINE_GRAIN_BUFFER\n");??
  • if(svm&CL_DEVICE_SVM_COARSE_GRAIN_BUFFER)??
  • ????printf("CL_DEVICE_SVM_COARSE_GRAIN_BUFFER\n");??
  • ? ? ? ?在我的AMD A10-7400 Radeon R6平臺上,當設備為CL_DEVICE_TYPE_GPU時,輸出為:

    [html] view plaincopy
  • CL_DEVICE_SVM_FINE_GRAIN_BUFFER??
  • CL_DEVICE_SVM_COARSE_GRAIN_BUFFER??
  • ? ? ? 對于細粒度系統SVM,AMD當前是不支持的。

    ? ? ? 粗粒度緩沖SVM和細粒度緩沖SVM大致用法,如下表格所示

    Coarse-grained SVM
    (Map/Unmap is requred)fine-grained SVM buffer
    [cpp] view plaincopy
  • float*?p?=?(float*)clSVMAlloc(…);??
  • ??
  • clEnqueueSVMMap(…,??
  • ????CL_TRUE,??//?block?until?map?is?done??
  • ????p,?…);??
  • ??
  • ??
  • //?Initialize?SVM?buffer??
  • p[i]?=?…;??
  • ??
  • clEnqueueSVMUnmap(…,?p,?…);??
  • ??
  • clEnqueueNDRange(…);??
  • ??
  • clEnqueueSVMMap(…,??
  • ????CL_TRUE,??//?block?until?map?is?done??
  • ????p,?…);??
  • ??
  • //?Read?the?data?produced?by?the?kernel??
  • …?=?p[i];??
  • ??
  • clEnqueueSVMUnmap(…,?p,?…);??
  • [cpp] view plaincopy
  • float*?p?=?(float*)clSVMAlloc(…);??
  • ??
  • ??
  • ??
  • ??
  • ??
  • ??
  • ??
  • //?Initialize?SVM?buffer??
  • p[i]?=?…;??
  • ??
  • ??
  • ??
  • clEnqueueNDRange(…);??
  • ??
  • clFinish(…);??
  • ??
  • ??
  • ??
  • ??
  • //?Read?the?data?produced?by?the?kernel??
  • …?=?p[i];???

  • 具體的SVM例子,請移步這里

    OpenCL2.0 SVM的講解,就到這吧!

    ?ps:最后嘮叨一句:對于SVM,方便了我們碼農編程,從硬件上來說,OpenCL設備與主機不一定是共享物理內存的。

    總結

    以上是生活随笔為你收集整理的OpenCL2.0特性之SVM的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。