看板 C_and_CPP 關於我們 聯絡資訊
這幾天寫嵌入式系統遇到這個問題 假設一個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://www.ptt.cc/bbs/C_and_CPP/M.1429112707.A.8D3.html CCT63:轉錄至看板 ASM 04/15 23:45
SocketAM2: compiler優化選項開下去後大概都一樣吧 04/16 00:27
SocketAM2: 從演算法下手對速度常常比較有感,除非是超內圈的loop 04/16 00:28
LPH66: 現在的編譯器技術是能夠做到即使寫 B[3*i]=A[i]; 04/16 00:28
LPH66: 還是能編出像原 PO 這邊這麼寫的機器碼的 04/16 00:29
SocketAM2: 或你是embed system類沒DMA的,不然在這種地方大概摳 04/16 00:29
LPH66: 呃, 應該是 B[i] = A[3*i]; XD 不過意思有到就是 04/16 00:30
SocketAM2: 不出速度來 04/16 00:30
LPH66: 這裡的問題我猜跟 A[3*i] 存取位址是 6 的倍數有一點點關係 04/16 00:31
LPH66: 6 的倍數表示大概要四圈才會有一個 aligned address 04/16 00:32
LPH66: 咦還是兩圈就有? 總之或許這裡有一點關係在 04/16 00:33
WYchuang: 看看特殊指令級有沒有支援 比如Neon一次可以搬蠻大量的 04/16 10:02
WYchuang: 資料 加上loop unrolling試看看 04/16 10:03