android+opencv+opencl: cv::dft()的opencl版本的性能分析
在小米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版本的性能分析的更多相关文章
- 【小记录】android下opencv的cv::dft()函数,CPU版本与opencl版本的性能相差16倍
cv::dft 相差15.9倍 cpu版本 单次调用 0.029448 毫秒 opencl版本 单次调用 0.468688 毫秒 差别仅 ...
- 【记录一个问题】opencv中 cv::dft()与cv::ocl_dft()计算的结果相差较大
以一个跟踪算法来测试: 使用cv::dft(), 矩阵未按照2次幂对齐,最终跟踪平均准确率 84.3% 使用cv::dft(),矩阵使用cv::copyMakeBorder对齐,最终跟踪平均准确率 8 ...
- 快速遍历OpenCV Mat图像数据的多种方法和性能分析 | opencv mat for loop
本文首发于个人博客https://kezunlin.me/post/61d55ab4/,欢迎阅读! opencv mat for loop Series Part 1: compile opencv ...
- 【失败经验分享】android下使用支持opencl的cv::dft()
1.使用了UMat,但是并未使用GPU计算 cv::dft()函数的定义是: void cv::dft( InputArray _src0, OutputArray _dst, int flags, ...
- 【感受】android + opencv + umat + opencl使用感受
近期编译了android下支持opencl的opencv,使用opencl能力的关键是用cv::UMat替换cv::Mat. 实际使用后发现坑很多,非常不成熟,不推荐使用这种方式来提升实际产品的性能. ...
- WINDOWS系统Eclipse+NDK+Android + OpenCv
WINDOWS系统Eclipse+NDK+Android + OpenCv 参考文档博客 1 NDK环境搭建 http://jingyan.baidu.com/article/5d6edee22d90 ...
- Android OpenCV样例调试+报错处理
1.OpenCV样例调试:<OpenCV Sample - image-manipulations> blog+报错:E/CAMERA_ACTIVITY(17665): Cam ...
- Android+openCV人脸检测2(静态图片)
前几篇文章中有提到对openCV环境配置,这里再重新梳理导入和使用openCV进行简单的人脸检测(包括使用级联分类器) 一 首先导入openCVLibrary320 二 设置gradle的sdk版本号 ...
- Android OpenCV 图像识别
最近打算写一个android 平台opencv 的小程序,着手查找了一下资料.网络上的资料参差不齐,有一些都比较老旧,我参考了前面的方法找到了一个简单的搭建方法,分享给大家. 0,环境的搭建: jav ...
随机推荐
- java 数据类型:集合接口Collection之List~ArrayList:remove移除;replaceAll改变原有值;sort排序;迭代器listIterator();
什么是List集合: 特点: 元素有序可重复的集合. 集合中每个元素都有其对应的顺序索引. List集合默认按元素的添加顺序设置元素的索引,索引从0开始. List接口的常用方法: List可以使 ...
- JAVA使用经纬度通过腾讯地图API获取详细地址
官方文档:https://lbs.qq.com/service/webService/webServiceGuide/webServiceGcoder package com.weixin.map; ...
- JAVA整合阿里云OSS实现文件上传功能
引入maven <dependency> <groupId>org.apache.commons</groupId> <artifactId>commo ...
- Flutter学习(9)——Flutter插件实现(Flutter调用Android原生
原文地址: Flutter学习(9)--Flutter插件实现(Flutter调用Android原生) | Stars-One的杂货小窝 最近需要给一个Flutter项目加个apk完整性检测,需要去拿 ...
- 【LeetCode】1020. Partition Array Into Three Parts With Equal Sum 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 【LeetCode】547. Friend Circles 解题报告(Python & Java & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 【LeetCode】151. Reverse Words in a String 翻转字符串里的单词(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.co ...
- Jenkins安装教程:Windows环境通过jenkins.war安装
1.Windows操作系统下,安装jdk.tomcat.maven.git,并配置好对应的环境变量,安装教程请自行查询资料 2.将下载的jenkins.war放入到tomcat的webapp文件夹下, ...
- Blazor组件的new使用方式与动态弹窗
1. 前言 在Blazor中的无状态组件文中,我提到了无状态组件中,有人提到这个没有diff,在渲染复杂model时,性能可能会更差.确实,这一点确实是会存在的.以上文的方式来实现无状态组件,确实只要 ...
- Java程序设计基础笔记 • 【第1章 初识Java】
全部章节 >>>> 本章目录 1.1 程序的概念及Java语言介绍 1.1.1 生活中的程序 1.1.2 计算机程序 1.1.3 算法和流程图 1.1.4 实践练习 1.2 ...