上位机图像处理和嵌入式模块部署(树莓派4b程序优化)

发布于:2024-05-07 ⋅ 阅读:(32) ⋅ 点赞:(0)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        我们把程序从pc端port到嵌入式开发板上面,好处是降低了部署成本,代价是牺牲了设备性能。所以等到程序真正在开发板子上面运行起来,并且解决了基本功能和稳定性之后,剩下来的就是程序优化工作。成年人的世界一般不做选择题,通常是既要、又要、还要。所以这个时候,程序代码的优化往往就显得非常重要了。

1、业务流程的优化

        很多做技术的同学往往习惯于技术的优化,忽视了业务层面的优化。比如说,如果客户的业务种类很少、流程不复杂,甚至于部分流程可以合并解决,那么这节省下来的计算资源、网络资源和存储资源,是多少技术方案都没有办法达到的效果。

2、全方位使用开发板资源

        我们写软件,一般习惯于考虑的都是cpu资源、ram资源、存储资源和网络资源。但是soc上面,还有gpu、dsp、mcu、npu等等,如果能把这些资源也用起来,常常有事半功倍的效果。

3、计算改查找

        一般嵌入式开发板的cpu频率都要比pc的低,指令集也采用了更节约资源的risc指令集。所以,在嵌入式开发板上面,能不要做计算就不要做计算,能用查表处理的就用查表处理。甚至于,在条件允许的范围内,把所有可能性都用查表来代替也不是不可以的。

4、用dma代替memcpy

        如果需要拷贝的数据非常多,这个时候最好复用soc提供的dma资源,而不是让cpu去一个一个搬数据,这样效率是非常低的。

5、用cacheable内存访问代替uncacheable内存

        记得以前在做图像的时候,经常混用cacheable内存和uncachebale内存。两者图像算法访问的速度差太多了。相信有过类似经验的同学,肯定会对这条trick印象深刻。

6、合理使用汇编指令

        arm下面有很多的mac指令、浮点指令。所谓的mac指令,主要就是矩阵的计算、浮点的计算,合理使用这些指令,也可以让程序加快运行速度。

7、并发cpu使用

        如果一个算法执行时间很长,那么没有必要全部用1个cpu来执行。我们可以做成pipeline的形式来处理。比如说,一个算法需要执行40ms,那么分成四个thread来跑,一个thread一个cpu。那么虽然算法执行的总时间没有改变,但是算法结果的输出效率提高了4倍。

8、使用ip内部的加速功能

        从名字上面可能不太好理解,但是我们举个例子就明白了。之前做一个网络报文的发送功能,中间有一个crc计算的子程序。一开始我们都是用软件计算的,后来发现eth ip可以自动帮助计算crc。发现这个功能之后,优化了代码,效率一下子增加了很多。

9、合理使用第三方库

        部分posix提供的函数,性能是比较差的,比如jemalloc第三方库就比自带的malloc库好很多。如果业务比较简单,自己写一个固定内存的分配模块,循环分配和使用也是可以的。

10、从上至下,从主要花费时间的模块入手

        从上至下比较好理解,也就是先从业务层,再从模块层,最后从实现层去优化功能。等这些大的部分做好之后,在实现层的角度,我们先找出最浪费时间的地方,比如循环最多的地方、io阻塞的地方、流程忙等的地方等等去入手。这样优化起来效率高,效果也比较明显。