第一種:使用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:code
cl_mem normalImage = clCreateImage(context, CL_MEM_WRITE_ONLY | CL_MEM_ALLOC_HOST_PTR, &imageFormat, &imageDesc, NULL, &err);
第三種,使用CL_MEM_USE_HOST_PTRorm
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則會得到比較差的效果。get