movidius优化心得

使用movidius进行开发也快一年了,越来越觉得这是款非常强大的芯片,这里记录一下一些性能优化的心得。

结论

1)shave上使用CMX内存比DDR速度会快2-3倍

2)使用汇编优化比单纯的硬件指令可以快几倍

优化中些常用方法

1)先在PC端进行代码优化,完成PC版本的结果一致性检查后再放到movidius上去跑。在PC端将代码写成纯C然后保证结果一致、同时注意内存用量的话,移植到movidius上基本都可以一步成功。

2)做好版本管理,执行优化前优化后运算结果一致性比对。代码优化是一个比较精细的活,稍不注意就可能会导致出错,所以进行代码改动必须时常进行一致性结果验证。我自己一般是会跑离线数据,再将当前结果和上一次结果比对,假如有不一致,就通过版本管理软件检查改动的代码

3)尽量将算法写成可以按行序进行运算的,这样的话可以将数据通过DMA加载到CMX内存进行处理。这是优化中最有效的一个手段,假如被访问的数据存放在DDR上,访问速度太慢必然会拖累处理器的运算能力

4)将一些密集运算部分的代码,尽量改写能使用硬件指令的结构。有一些密集运算,可能不能直接使用硬件指令,但是通过缓存、构造中间结果,仍然可以使用硬件指令来加速

5)尝试使用汇编指令,这是最终极的优化手段,现在还不怎么熟悉这个,以后有机会补上~~

错误排查

有时候代码在PC端运行得好好的,运行结果也一致,但是跑到movidius上结果就是不对,这是优化过程中经常会碰到的事,有时候排查起来确实让人抓狂,但是应对起来也是有一些方法的

1)检查内存用量

 movidius上每个shave的CMX内存容量是有限的,数据空间一般都才60K左右(另外剩余的配置成代码空间),假如shave上一个过程中,占用的内存量超过了配置的数据空间用量,运行起来后就很有可能导致结果异常

2)检查是否有刷新缓存

  假如shave上对DDR写入了数据,然后再到RT侧去取数据,这个时候就要刷新下缓存,不然的RT侧访问到的数据可能还是先前缓存的旧数据。刚开始使用movidius开发的时候经常碰到这个问题,明明shave上代码没问题,为啥就是没正确的数据输出~~!

3)使用排除法

将部分可能代码排除再运行,基本可以定位到有问题的地方

一些坑

1)dma操作的时候,假如拷贝的数据长度为0,会直接导致movidius卡死,所以dma操作前一定得判断下拷贝的数据长度是否为0

2)movidius上一些库的汇编版本和c版本结果不一致,很多时候汇编版本要求传入的数据长度是16的整数倍,不然结果可能异常

暂时写这么多,后面想到别的再补充~~

你可能感兴趣的:(movidius优化心得)