1. 程式人生 > >OpenCL中三種記憶體建立image的效率對比

OpenCL中三種記憶體建立image的效率對比

第一種:使用ION:

cl_mem_ion_host_ptr ion_host_ptr1;
ion_host_ptr1.ext_host_ptr.allocation_type = CL_MEM_ION_HOST_PTR_QCOM;
ion_host_ptr1.ext_host_ptr.host_cache_policy = CL_MEM_HOST_UNCACHED_QCOM;   
ion_host_ptr1.ion_filedesc = fd_data.fd;
ion_host_ptr1.ion_hostptr = host_addr;

clock_gettime(CLOCK_REALTIME, &ts);
cl_mem input_image = clCreateImage(context,
        CL_MEM_WRITE_ONLY | CL_MEM_USE_HOST_PTR | CL_MEM_EXT_HOST_PTR_QCOM, 
                                   &imageFormat, &imageDesc,
                                   &ion_host_ptr1,    
                                   &err);

第二種,使用OpenCL API:

cl_mem normalImage = clCreateImage(context, CL_MEM_WRITE_ONLY | CL_MEM_ALLOC_HOST_PTR, &imageFormat, &imageDesc, NULL, &err);

第三種,使用CL_MEM_USE_HOST_PTR

cl_mem normalImage = clCreateImage(context, CL_MEM_WRITE_ONLY | CL_MEM_USE_HOST_PTR , &imageFormat, &imageDesc, data, &err);

然後用這三個cl_mem去執行相同的kernel(用255減去畫素值,影象大小為1440x1080),然後把結果clEnqueueMapImage到host指標,然後再使用memcpy複製到另外一塊host記憶體,測量時間如下,單位為ms:

方式 clCreateImage clEnqueueNDRangeKernel clEnqueueMapImage
ION 0.05 1.5 0.035
OpenCL API 0.8 1.5 0.5
CL_MEM_USE_HOST_PTR 1.7 2.4 1.0

同時,clEnqueueUnmapMemObject和memcpy都很快,耗時分別為0.015ms和0.0004ms左右。
從測量結果來看,使用ION的方式,在各項速度上都是佔優的。使用OpenCL API也比較接近。而使用CL_MEM_USE_HOST_PTR則會獲得比較差的效果。