在小米mix 2s + 高通骁龙 845 + Adreno 630 上测试了opencl版本的cv::dft()。

测试数据

先看表格里面的描述:

名称 函数名 最大时间(ms) 平均时间(ms) 说明
cpu版本dft cv::dft() - 0.029448 未统计其他,仅cv::dft()函数的调用时间
opencl版本 cv::dft(UMat) 802.557000 0.202941 不计算mat与umat的拷贝,不计算umat的填充对齐
opencl中使用opencl计算的主函数 cv::ocl_dft() 802.553000 0.210583 cv::dft()包装了cv::ocl_dft(),这一层无太多性能损耗
ocl_dft第一步调用的子函数 ocl_dft_rows() 802.518000 0.1031 -
ocl_dft第二步调用的子函数 ocl_dft_cols() 338.004000 0.078061 -
对象池 OCL_FftPlanCache::getInstance().getFftPlan() 0.190000 0.000028 对象池很快,几乎不占用时间,可以忽略
opencl的核函数编译、绑定参数、计算 OCL_FftPlan::enqueueTransform() 464.393000 0.075685 -
核函数编译 enqueueTransform() 464.237000 0.019422 第一次编译很慢,以后会快很多。但是也不用重复编译才对
参数绑定 enqueueTransform() 0.122000 0.016015 绑定参数也很快
核函数执行 enqueueTransform() 1.167000 0.028805 -

结果分析

有这样一些结论:

  • 令人失望:opencl+gpu版本的平均时间 0.202941,而CPU版本的平均时间是 0.029448,GPU版本比CPU版本慢了6.9倍;而且还未加上Mat拷贝到UMat, Mat填充对齐,UMat拷贝回Mat等部分占用的时间;
  • 可以发现,第一次执行cv::dft()的opencl版本的时候,编译核函数很耗时(464ms),后续的编译占用时间尚可;
  • 纯计算时间上看,opencl核函数执行时间大约是0.028805 * 2,大约是CPU版本的1.96倍。产生这样的原因可能是我的测试数据很小,如果数据量很大,GPU版本在纯计算时间上可能会比CPU版本好一些。

优化计划

  • 在调用cv::dft()的opencl版本以前,开一个线程空调用一次cv::ocl_dft(),这样核函数的编译时间就不会占用总调用时间了。
  • ocl::Kernel这里可以建立对象池,而不是每次调用都使用临时对象,这样的话,每次调用可以节约0.019422ms,性能可提升9.6%;
ocl::Kernel k(kernel_name.c_str(), ocl::core::fft_oclsrc, options);
  • 如果采用GPU内存池,每次计算的输入和输出地址都不变,那么参数绑定环节的0.016015ms可以省略,性能可能提升7.9%
  • 在我的cv::dft()的使用场景中,每次连续计算44个矩阵的数据。假设能够找到方法,把44次计算陆续加入队列,让GPU连续计算。假设GPU并发度支持44次计算同时进行,那么GPU版本的理论延迟是 0.202941/44 = 0.004612, 比CPU版本提升 6.39倍!

android+opencv+opencl: cv::dft()的opencl版本的性能分析的更多相关文章

  1. 【小记录】android下opencv的cv::dft()函数,CPU版本与opencl版本的性能相差16倍

            cv::dft  相差15.9倍         cpu版本  单次调用  0.029448 毫秒         opencl版本  单次调用  0.468688  毫秒   差别仅 ...

  2. 【记录一个问题】opencv中 cv::dft()与cv::ocl_dft()计算的结果相差较大

    以一个跟踪算法来测试: 使用cv::dft(), 矩阵未按照2次幂对齐,最终跟踪平均准确率 84.3% 使用cv::dft(),矩阵使用cv::copyMakeBorder对齐,最终跟踪平均准确率 8 ...

  3. 快速遍历OpenCV Mat图像数据的多种方法和性能分析 | opencv mat for loop

    本文首发于个人博客https://kezunlin.me/post/61d55ab4/,欢迎阅读! opencv mat for loop Series Part 1: compile opencv ...

  4. 【失败经验分享】android下使用支持opencl的cv::dft()

    1.使用了UMat,但是并未使用GPU计算 cv::dft()函数的定义是: void cv::dft( InputArray _src0, OutputArray _dst, int flags, ...

  5. 【感受】android + opencv + umat + opencl使用感受

    近期编译了android下支持opencl的opencv,使用opencl能力的关键是用cv::UMat替换cv::Mat. 实际使用后发现坑很多,非常不成熟,不推荐使用这种方式来提升实际产品的性能. ...

  6. WINDOWS系统Eclipse+NDK+Android + OpenCv

    WINDOWS系统Eclipse+NDK+Android + OpenCv 参考文档博客 1 NDK环境搭建 http://jingyan.baidu.com/article/5d6edee22d90 ...

  7. Android OpenCV样例调试+报错处理

    1.OpenCV样例调试:<OpenCV Sample - image-manipulations>       blog+报错:E/CAMERA_ACTIVITY(17665): Cam ...

  8. Android+openCV人脸检测2(静态图片)

    前几篇文章中有提到对openCV环境配置,这里再重新梳理导入和使用openCV进行简单的人脸检测(包括使用级联分类器) 一 首先导入openCVLibrary320 二 设置gradle的sdk版本号 ...

  9. Android OpenCV 图像识别

    最近打算写一个android 平台opencv 的小程序,着手查找了一下资料.网络上的资料参差不齐,有一些都比较老旧,我参考了前面的方法找到了一个简单的搭建方法,分享给大家. 0,环境的搭建: jav ...

随机推荐

  1. CF20B Equation 题解

    Content 解方程 \(ax^2+bx+c=0\). 数据范围:\(-10^5\leqslant a,b,c\leqslant 10^5\). Solution 很明显上求根公式. 先来给大家推推 ...

  2. LuoguB2106 矩阵转置 题解

    Content 给定一个 \(n\times m\) 的矩阵 \(A\),求其转置 \(A^\text T\). 数据范围:\(1\leqslant n,m\leqslant 100\). Solut ...

  3. Xftp设置指定记事本(notepad++)打开文件

    右键

  4. HttpServletResponse工具类和HttpServletRequest工具类,前台参数接收方式和后台返回(JSON)数据格式

    RequestUtils.java 操作类 package cn.utils; import org.apache.commons.lang3.StringUtils; import org.slf4 ...

  5. JAVA结合Redis处理缓存穿透问题

    public List<WeixinMenu> getList() { List<WeixinMenu> weixinMenuList= (List<WeixinMenu ...

  6. NLTK 3.2.5 documentation Installing NLTK

    Installing NLTK NLTK requires Python versions 2.7, 3.4, or 3.5 Mac/Unix Install NLTK: run sudo pip i ...

  7. Lucene 基础类型

    Lucene 索引文件中,用一下基本类型来保存信息:1. Byte:是最基本的类型,长 8 位(bit).2. UInt32:由 4 个 Byte 组成.3. UInt64:由 8 个 Byte 组成 ...

  8. 【LeetCode】191. Number of 1 Bits 解题报告(Java & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 右移32次 计算末尾的1的个数 转成二进制统计1的个 ...

  9. 【LeetCode】982. Triples with Bitwise AND Equal To Zero 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  10. 【LeetCode】934. Shortest Bridge 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS + BFS 相似题目 参考资料 日期 题目地 ...