clCreateBuffer中cl_mem_flags参数解释
設備與主機端的通信
使用clCreateBuffer分配好內存,可以使用主機上已經存在的內容將其進行初始化,也可以先創建內存,再通過clEnqueueWriteBuffer,寫數據,或者通過clEnqueueMapBuffer,將設備上的數據映射到主機端進行修改,修改后需要解映射,最后將分配好的內存,通過參數設置clSetKernelArg給到設備,如果數據改變了,則可以使用clEnqueueReadBuffer來讀取數據,或者使用clEnqueueMapBuffer將內存映射到主機端進行訪問,需要注意的是,在主機端對數據修改后,需要unmap,這樣,設備端再次訪問該數據的時候,就會是修改后的數據,否則訪問未經解映射的內存,可能會讀到預料不到的結果
clCreateBuffer函數用來給緩存對象分配內存,創建的內存可以是global、local、private,具體看kernel中怎么樣聲明限定符。
這里的buffer概念是用于kernel函數計算的,只有這里分配的內存可以用于kernel函數執行,其函數簽名如下:
cl_mem_flags參數可選項如下:
前面3個參數主要是限制設備在分配的內存上的可訪問性
1 CL_MEM_READ_WRITE:
設備可以讀寫,host_ptr可為空,這表明該參數不需要初始化
2 CL_MEM_WRITE_ONLY:
設備只寫,host_ptr可為空,表明不需要初始化
3 CL_MEM_READ_ONLY:
設備只讀,不能為空
下面的3個參數控制內存分配4 CL_MEM_USE_HOST_PTR:
目的:在設備端處理緩存對象,并將緩存對象返回給主機,host_ptr指針不能為空(CL_MEM_USE_HOST_PTR優先采用在CPU端分配內存空間,讓GPU端有訪問權限,如果硬件不支持這種方式的話,則在GPU端開辟一塊緩存,存儲host_ptr里的內容)
特點是主機和設備端都可以訪問,
類似于將主機上的內存塊映射到設備上供設備使用,雖然是同一塊內存,但是有可能在設備上對該
內存操作了,在主機上訪問的結果不正確,因此有可能需要對數據進行同步5 CL_MEM_COPY_HOST_PTR:
目的:在設備端處理數據,也不需要將數據返回給主機
在設備端分配內存,并將hsot_ptr指針指向的內存,拷貝size大小的數據到設備內存上去,
host_ptr不能為空,由于是直接拷貝,因此在設備端對數據進行修改后,主機端不能夠獲取相應數據6 CL_MEM_ALLOC_HOST_PTR:
目的:在主機可訪問的地方分配內存,在設備端對數據進行初始化
在該標志位下,opencl可能直接在固定內存上分配內存(而在固定內存上操作系統使用DMA進行數據傳輸 )
CL_MEM_ALLOC_HOST_PTR和CL_MEM_USE_HOST_PTR不能夠同時使用
CL_MEM_ALLOC_HOST_PTR必須和CL_MEM_COPY_HOST_PTR一起使用,不能單獨使用,他們聯合起來可用于初始化主機可訪問的內存塊(如PCIe:新的總線和接口標準,主要優勢是數據傳輸速率高),
這可能比使用CL_MEM_USE_HOST_PTR要速度快
clCreateBuffer分配的內存所指向的連續數據位置,在內核執行期間,內核都能夠訪問
- 最后,總結一下:
cl_mem_flags參數的前三個使用來限制設備的讀寫權限的,而不是主機端讀寫權限
后三個參數中,如果主機端的數據直接傳輸后不需要再讀取結果,就使用CL_MEM_COPY_HOST_PTR,
如果數據需要再讀取回來,則可以使用CL_MEM_ALLOC_HOST_PTR和CL_MEM_COPY_HOST_PTR一起或者CL_MEM_USE_HOST_PTR
總結
以上是生活随笔為你收集整理的clCreateBuffer中cl_mem_flags参数解释的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java streamhandler_使
- 下一篇: 2、【斯纳克图书馆管理系统】运行环境