OpenCL中緩衝區對象(buffer object)的理解

內存對象(memory object)是OpenCL跨平臺的一個重要方面,因爲不需要將向device傳遞的數據轉換成device特定的硬件平臺的數據類型,而統一打包成cl_mem對象。緩衝區對象(Buffer Object)就是host向device傳遞數據的一種重要的內存對象。

通過clCreateBuffer函數可以創建緩衝區對象(返回值爲cl_mem),函數原型如下:

clCreateBuffer(cl_context context, cl_mem_flags options, size_t size, void *host_ptr, cl_int *error)

這裏重點解釋一下options這個參數。cl_mem_flags有以下六個值:

  • CL_MEM_READ_WRITE(default)
  • CL_MEM_WRITE_ONLY (host_ptr可以爲NULL,因爲緩衝區對象分配在device的內存區域中,比如gpu的vram)
  • CL_MEM_READ_ONLY
  • CL_MEM_USE_HOST_PTR  (緩衝區對象不需要重新分配,而是引用host_ptr的內存)
  • CL_MEM_COPY_HOST_PTR(緩衝區在其他地方分配內存,並把host_ptr指向的內存數據拷貝到新分配的內存區域中)
  • CL_MEM_ALLOC_HOST_PTR(結合CL_MEM_COPY_HOST_PTR使用,只是其他地方必須是host可以訪問的內存,如PCIe

注意:前面三個標誌是device對緩衝區對象的訪問限定符,而不是host對緩衝區對象的訪問限定符。

後面三個標誌用來指定緩衝區對象分配的地方。

這裏再重點講解下CL_MEM_COPY_HOST_PTR情況下緩衝區對象被分配在什麼地方呢?分兩種情況:

1)context對象只有一個device,這種情況下,緩衝區對象基本上是分配在device上的,除非device沒有足夠的內存空間了纔會分配在host上。

2)context對象有多個devices,這種情況下,緩衝區對象會分配在這些devices之中的某個device上。但是也有可能會移動到其他的設備上,這取決於kernel在哪個device上啓動了。

OpenCL 1.2有個函數clEnqueueMigrateMemObjects提供了一種機制用於指定OpenCL的內存對象被分配在哪個device上。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章