找回密码
 注册
关于网站域名变更的通知
查看: 528|回复: 3
打印 上一主题 下一主题

arm通用指令需要注意的地方

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-6-16 13:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
1、 load数据的时候,第一次load会把数据放在cache里面,只要不超过cache的大小,下一次load同样数据的时候,则会比第一次load要快很多,会直接从cache中load数据,这样在汇编程序设计的时候是非常需要考虑的问题。
     如:求取一个图像的均值,8*8的窗口,先行求和,然后列求和出来均值,这时候会有两个函数,数据会加载两遍,如果按照这样去优化的话则优化不了多少。如果换成上面这种思路,先做行16行,然后再做列,这样数据都在cache里面,做列的时候load数据会很快。
   2、在做neon乘法指令的时候会有大约2个clock的阻塞时间,如果你要立即使用乘法的结果,则就会阻塞在这里,在写neon指令的时候需要特别注意。乘法的结果不能立即使用,可以将一些其他的操作插入到乘法后面而不会有时间的消耗。
如:vmul.u16 q1, d3, d4
         vadd.u32 q1, q2, q3
此时直接使用乘法的结果q1则会阻塞,执行vadd需要再等待2个clock的时间
3、使用饱和指令的时候,如乘法饱和的时候,在做乘法后会再去做一次饱和,所以时间要比直接做乘法要慢。
如:  vmul.u16 q1, d3, d4
          vqmul.u32 q1, q2, q3
后一个的时间要比第一个的时间要久。
4、在对16位数据进行load或者store操作的时候,需要注意的是字节移位。比如是16位数据,则load 8个16位数据,如果指定寄存器进行偏移,此时需要特别注意。
例如:vld1.64 {d0}, [r0], r1
5、去除数据之间的依赖
不要将当前指令的目的寄存器作为下一条指令的源寄存器。一般当前指令的运算结果会在下一条指令中使用,我们可以通过指令穿插避免数据依赖。
6、减少分支跳转
ARM处理器中广泛使用分支预测技术。但是一旦分支预测失败,性能就会损失很大。所以,
8 E& ^( w& P$ {4 W尽量不要用分支跳转!可以采用逻辑运算指令替代分支跳转!
. [# j7 J# H" k+ d0 B比如: , E8 `$ p( w1 c7 v. F
VCEQ, VCGE, VCGT, VCLE, VCLT…… ' E/ k* v* x5 }8 e& ]2 j
VBIT, VBIF, VBSL…… 9 M- d& U5 Q0 i4 z4 V# E
另外,可以使用条件执行指令,比如addgt,suble等减少分支跳转! & ]2 n- |+ m* ~1 y
建议一次性多处理几行数据,从而减少循环跳转的次数,提升性能。

* ^/ n0 |* q; k; v, A

该用户从未签到

2#
发表于 2021-6-16 14:55 | 只看该作者
arm通用指令需要注意的地方
  • TA的每日心情

    2019-11-29 15:37
  • 签到天数: 1 天

    [LV.1]初来乍到

    3#
    发表于 2021-6-16 17:09 | 只看该作者
    arm通用指令需要注意的地方

    该用户从未签到

    4#
    发表于 2021-6-16 17:10 | 只看该作者
    arm通用指令需要注意的地方
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-6-23 08:19 , Processed in 0.078125 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表