[問題] 將向量的資料作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