目录
一.程序加速
1.编程基本原则
短、简洁、有效率
2.代码优化策略
a)选择合适的算法(算法复杂度)
b)代码简洁简单(易读)
c)高效的内存读写(地址相连效率高)
d)避免内存拷贝(代码会变得更加复杂)(指针)
e)循环里面或者执行很多次不要加printf(),cout,会阻塞程序执行
f)查表法(计算机擅长整数的加法乘法)(三角函数精度要求不高用查表法)
g)SIMD, OpenMP
3.SIMD
一个指令处理多个数据
两个向量相加,将几个元素一起装在到寄存器里面去,一个指令一次加完,上面提速4倍
- OpenCV: Universal intrinsics
- 使用OpenCV中的universal intrinsics为算法提速(1)(2)(3)
4.openMP
SIMD是在一个cpu核上
openMP将任务分给不同cpu核去运行
#include <omp.h>
#pragma omp parallel for
for (size_t i = 0; i < n; i++)
{
c[i] = a[i] + b[i];
}
二.避免内存拷贝(OpenCV)
1.什么是图像
2.Mat
Refcount,OpenCV申请内存时多申请4个字节,记录这块内存被多少头引用
头释放Refcount-1,减到0,将数据mat释放
3.Step
4行3列矩阵
每一行3个字节
可以申请3,4,8个字节
如果是8的话可以做内存对齐,做SIMD时比较方便
4.ROI
- Mat A
- rows=100
- cols=100
- step=100
- data=0xABCDEF00
- Mat B
- rows=100
- cols=100
- step=100
- data=0xABCDEF00
- Mat C
- rows=30
- cols=28
- step=100 第二行=第一行+step(偏移100个地址)加29次到30行
- data=0xABCE0698