算法优化的一般方法——以ARM平台为例

 目录

一、为什么要进行算法优化?

二、算法优化方法


一、为什么要进行算法优化?

算法在部署到硬件平台时,对于性能的要求非常高,如果不进行一定程度的优化,算法耗时一般来讲都难以满足要求。

二、算法优化方法

算法优化的一般思路如下图。优化的思想可以看成一个金字塔,分为方案改进、平台优化和局部热点优化几个部分,在金子塔的底部进行优化效果最好,越往上对性能的提升越少

优化的通用流程是,先分析优化的需求是否合理,评估一下该需求是否可以实现,然后分析算法性能,找出算法的瓶颈在哪里,是算力、计算量、带宽等因素中的哪一个影响了耗时。通常代码的耗时应该满足二八原则,即20%的代码消耗80%的时间。优化的策略应该从大到小,从整体到局部,然后不断进行迭代,直到达到需求

图1 算法优化的一般思路

1、方案改进

(1)算法改进

使用更先进的算法替换原有算法;

(2)数据流优化

整理数据流,减少无效处理,减少数据拷贝,减少内存间的读写依赖;

(3)等效算法

exp、log、sin等计算用查表法替代;用位操作代替乘法、除法等运算;避免不必要的除法运算(整数除法是整数运算中最慢的)

2、平台相关优化

(1)cache优化

a) 指令cache优化

将调用次数较多的函数设置为inline函数,减少函数调用开销,减小指令跳转,使得指令cache命中率变高。

b)数据cache优化

预取数据:在本次计算中,预取下一次需要的数据(GCC内置函数 )

void __builtin_prefetch (const void *addr, ...)

数据重排:把数据重新排列,使其对cache访问友好,减少cache miss。可参考 AI | 如何实现高速卷积?深度学习库使用了这些「黑魔法」

(2)并行优化

不同处理单元并行(ARM、DSP等)或者多个CPU并行(可使用OpenMP接口)

(3)逻辑优化

a)循环优化

将循环展开;将最忙的循环放在最内层;尽可能将判断放在循环外进行。

b)编译优化

合适的编译级别(-O0\-O1\-O2\-O3);利用Restrict关键字、register变量;快速数学计算(-ffast-math)等

(4)指令优化

利用NEON指令进行优化,实现SIMD(单指令多数据)

(5)带宽优化

a)数据宽度降低

32位浮点数简化为8位整型

b)地址对其

数据地址对齐,减少不必要的内存访问开销

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值