OpenCL的buffer以及sub-buffer
buffer,sub-buffer和image對比
相同點:都是OCL memory物件
維度 | 特性關鍵詞 | |
---|---|---|
buffer | 一維 | array of bytes |
sub-buffer | 一維 | views intobuffer |
image | 二維或者三維 | 讀寫操作、可選的format、sampler及clamp |
關於buffer的釋放問題
在OpenCL中,對於cl_mem
物件都是採用reference-counted
的模式來控制對相應資源的釋放的。OpenCL中增加某個cl_mem
的方法為cl_int clRetainMemObject (cl_mem memobj)
,而clCreateBuffer, clCreateSubBuffer, clCreateImage2D, and clCreateImage3D
都會執行一個 implicit retain。clCreateSubBuffer also performs an implicit retain on the memory object used to create the sub-buffer or image object. 所以,如果一個cl_men物件建立了多個sub-buffer,那麼應該對每個sub-buffer都進行clRelaseMemObject
. 降低引用計數的方法為cl_int clReleaseMemObject (cl_mem memobj)
. 當一個cl_mem
的引用計數變為0,且相關的命令也已經執行完畢,那麼OCL就會釋放相關資源。
另外,clSetKernelArg並不會retain相關的cl_mem。
查詢cl_mem物件的相關資訊
可以使用clGetMemObjectInfo
查詢到cl_mem
物件的各種相關資訊。如下的程式碼查詢cl_mem
物件是何種型別:
cl_int errNum; cl_mem memory; cl_mem_object_type type; // initialize memory object and so on errNum = clGetMemObjectInfo( memory, CL_MEM_TYPE, sizeof(cl_mem_object_type), &type, NULL); switch(type) { case CL_MEM_OBJECT_BUFFER: { // handle case when object is buffer or sub-buffer break; } case CL_MEM_OBJECT_IMAGE2D: case CL_MEM_OBJECT_IMAGE3D: { // handle case when object is a 2D or 3D image break; } default // something very bad has happened break; }
buffer的讀寫
OpenCL中,host可以使用command來執行對buffer的讀寫。值得一提的是,在建立buffer的時候,比如使用clCreateBuffer
,使用合適的引數,比如CLK_MEM_COPY_HOST
,也可以實現對buffer資源的寫入操作。但是,這種做法起碼有三個明顯的侷限性:
cl_mem
而OCL提供的相關command則可以十分自由的進行各種操作。
- clEnqueueWriteBuffer:把host的內容寫入的buffer region
- clEnqueueReadBuffer:把buffer的內容複製到host記憶體中
- clEnqueueReadBufferRect:把一個二維或者三維的buffer的部分割槽域資料複製到host記憶體
- clEnqueueWriteBufferRect:把host上的資料寫入到二維或者三維buffer的區域性區域
- clEnqueueCopyBuffer:從一個buffer拷貝資料到另一個buffer,適用於一維的
- clEnqueueCopyBufferRect:從一個buffer拷貝片段資料到另一個buffer片段,適用於二維或者三維的
map buffer and sub-buffer
mapping一個buffer或者sub-buffer可以得到一個host指標,這個指標可以直接在host上使用,比如作為引數傳給其他函式,但這些函式不會感知到這些記憶體實際是由OCL管理並利用的。
map使用clEnqueueMapBuffer
,使用完之後需要unmap,使用clEnqueueUnmapMemObject
.
參考:ofollow,noindex" target="_blank">OpenCL Programming Guide