作者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/m.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