2007.04.09继续优化

本文介绍了使用ARM指令集进行2倍放大模块的优化过程。通过巧妙地利用数学运算和位操作,作者实现了一个高效的序列转换算法,将原始序列长度翻倍,并探讨了进一步提升性能的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天优化的部分是缩放, 也就是一个2倍放大的模块.

 

转换成数学表示就是:

有一个序列p1, p2, p3, p4, p5....以数组的方式存放, 每个存储为一个字节.

现在要把这个序列转换成另外一个序列.
(p1*3+p2)/4, (p2*3+p)/41, (p2*3+p3)/4, (p3*3+p2)/4, (p3*3+p4)/4, (p4*3+p3)/4, (p4*3+p5)/4....

每个结果也存到一个字节中.


可以看出来结果序列长度是原始序列长度的2倍.
我今天想出来的办法是一次计算出4个点来,也就是(p1*3+p2)/4, (p2*3+p)/41, (p2*3+p3)/4, (p3*3+p2)/4, 正在想更快的办法中. 

我是这样做的,先算好2个DWORD,分别是
T1 = Xp1Xp2;
T2 = Xp2Xp3;

这里X表示8个0的位,就是把p1和p2分开来
然后计算
((((T1*3+T2)>>2)&0xFF00FF)<<8) + ((((T1+T2*3)>>2))&0xFF00FF)

一次把4个点全算好了.
然后继续来做
T3 = (T2<<16) + p4
T4 = (T3<<16) + p5
然后再计算2个点,其中*3cup会自己优化成加法的.

今天看了专门介绍ARM指令集的文档,感觉收获不少,优化无止境啊.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值