[问题] 将向量的资料作scale down

楼主: CCT63 (CCT)   2015-04-15 23:45:05
这几天写嵌入式系统遇到这个问题
假设一个array
unsigned short A[]=[0 1 2 3 ... 31];
我需要将A每3点取样一次存到另一个unsigned short B[]
目标: B[] = [0 3 6 ... 30]
我用的写法类似这样
for(i=0,j=0;i<32;i+=3,j++)
{
*(B+j) = *(A+i);
}
但是似乎这样还是抢了一些其他IP的时间....
所以想请问一下有更好的写法可以增加效率吗?
谢谢
作者: SocketAM2 (AM2)   2015-04-16 00:27:00
compiler优化选项开下去后大概都一样吧从算法下手对速度常常比较有感,除非是超内圈的loop
作者: LPH66 (-6.2598534e+18f)   2015-04-16 00:28:00
现在的编译器技术是能够做到即使写 B[3*i]=A[i];还是能编出像原 PO 这边这么写的机器码的
作者: SocketAM2 (AM2)   2015-04-16 00:29:00
或你是embed system类没DMA的,不然在这种地方大概抠
作者: LPH66 (-6.2598534e+18f)   2015-04-16 00:30:00
呃, 应该是 B[i] = A[3*i]; XD 不过意思有到就是
作者: SocketAM2 (AM2)   2015-04-16 00:30:00
不出速度来
作者: LPH66 (-6.2598534e+18f)   2015-04-16 00:31:00
这里的问题我猜跟 A[3*i] 存取位址是 6 的倍数有一点点关系6 的倍数表示大概要四圈才会有一个 aligned address咦还是两圈就有? 总之或许这里有一点关系在
作者: WYchuang (爱赖床的黄金猎犬)   2015-04-16 10:02:00
看看特殊指令级有没有支援 比如Neon一次可以搬蛮大量的资料 加上loop unrolling试看看

Links booklink

Contact Us: admin [ a t ] ucptt.com