【opencv基础】代码优化加速相关

1. 浮点数据定点化;

cv::Mat tmp1 = values * 1000000;
tmp1.convertTo(tmp1, CV_32SC1);
cv::Mat tmp2 = this->weights * 1000000;
tmp2.convertTo(tmp2, CV_32SC1);
cv::Mat tmp(tmp1.rows, tmp2.cols, CV_64FC1);
tmp = tmp1 * tmp2 / 1000000000000.0f;
tmp.convertTo(tmp, CV_32FC1);
View Code

opencv中cv::Mat数据矩阵乘法,需要各个数据的类型是一样的,且需要注意数据溢出问题,以及矩阵乘法支持Mat矩阵的数据类型(type)只能是 CV_32FC1、 CV_64FC1、 CV_32FC2、 CV_64FC2 这4种类型中的其中一种。定点化一般指的是两个浮点数据转换为整形数据相乘,这样才能加速,而我们的转换过程矩阵乘法一直都是浮点数据相乘,所以对加速没用,甚至会增加额外的转换过程的耗时。

2. 使用eigen库运算;

3. 使用加速优化的编译选项;

使用浮点运算;使用neon;可以使用不同的架构选项、ARM选项等等;

QMAKE_CXXFLAGS += -march=armv8 -mfloat-abi=hard -mfpu=vfpv4-d16 -mfpu=neon

4. 使用多线程;

注意互斥锁和信号量;

5. 使用多核并行编程;

openmp

6. 充分利用硬件的最高性能

为了充分释放所有核心的计算能力,我们将所有的CPU都配置为可用的最高时钟,这时候请务必使用良好的散热器件为处理器降温。
利用高性能的大核快速完成运算,低性能小核则提供优化的功耗表现。
root@apalis-imx8:~# echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
root@apalis-imx8:~# echo performance > /sys/devices/system/cpu/cpu4/cpufreq/scaling_governor
这里总共有 CPU 0 到 CPU 5,其中 CPU 0~CPU 3 为 Cortex-A53,CPU 4~CPU 5 为 Cortex-A72。
在 4 个 A53 同时运行: root@apalis-imx8:~# taskset 0x0f time ./smallpt 100
在 2 个 A72 同时运行:root@apalis-imx8:~# taskset 0x30 time ./smallpt 100
在 4 个 A53 和 2 个 A72 同时运行:root@apalis-imx8:~# taskset 0x3f time ./smallpt 100
0x30 表示允许使用两个 A72 核心,0x10 表示只使用一个 A72,同样 0x01 表示只使用一个 A53,而 0x3F 则
表示使用所有的处理器核心。需要注意的是,这里是指用 taskset 工具指定某一个程序所使用的处理器核心,不被
指定的处理器核心仍处于工作状态,只是不用其来运行该程序。因此 taskset 并不能启到关闭处理器核心的功能。
Taskset 通过设置 CPU 掩码来选择 CPU。我们可以用 cpufreq-info 命令查看所有可用的 CPU。
 
使用taskset方法可以进行加速;
加速之后一个循环体大概需要19-38ms;

 7.

 

 

参考

1. eigen;

2. GNU_GCC;

3. openmp_MSDN;

4. openmp_example_smallpt;

5. openmp_org;

 

posted on 2020-06-11 16:10  鹅要长大  阅读(1418)  评论(0编辑  收藏  举报

导航