欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

OpenCL中三种内存创建image的效率对比

程序员文章站 2022-03-24 12:34:48
第一种:使用ION: 第二种,使用OpenCL API: 第三种,使用CL_MEM_USE_HOST_PTR 然后用这三个cl_mem去执行相同的kernel(用255减去像素值,图像大小为1440x1080),然后把结果 到host指针,然后再使用memcpy复制到另外一块host内存,测量时间如 ......

第一种:使用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则会获得比较差的效果。