作者CCT63 (CCT)
看板C_and_CPP
标题[问题] 将向量的资料作scale down
时间Wed Apr 15 23:45:05 2015
这几天写嵌入式系统遇到这个问题
假设一个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的时间....
所以想请问一下有更好的写法可以增加效率吗?
谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.161.216.179
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1429112707.A.8D3.html
※ CCT63:转录至看板 ASM 04/15 23:45
1F:→ SocketAM2: compiler优化选项开下去後大概都一样吧 04/16 00:27
2F:→ SocketAM2: 从演算法下手对速度常常比较有感,除非是超内圈的loop 04/16 00:28
3F:推 LPH66: 现在的编译器技术是能够做到即使写 B[3*i]=A[i]; 04/16 00:28
4F:→ LPH66: 还是能编出像原 PO 这边这麽写的机器码的 04/16 00:29
5F:→ SocketAM2: 或你是embed system类没DMA的,不然在这种地方大概抠 04/16 00:29
6F:→ LPH66: 呃, 应该是 B[i] = A[3*i]; XD 不过意思有到就是 04/16 00:30
7F:→ SocketAM2: 不出速度来 04/16 00:30
8F:→ LPH66: 这里的问题我猜跟 A[3*i] 存取位址是 6 的倍数有一点点关系 04/16 00:31
9F:→ LPH66: 6 的倍数表示大概要四圈才会有一个 aligned address 04/16 00:32
10F:→ LPH66: 咦还是两圈就有? 总之或许这里有一点关系在 04/16 00:33
11F:推 WYchuang: 看看特殊指令级有没有支援 比如Neon一次可以搬蛮大量的 04/16 10:02
12F:→ WYchuang: 资料 加上loop unrolling试看看 04/16 10:03