[問題] 將向量的資料作scale down

看板C_and_CPP作者 (CCT)時間9年前 (2015/04/15 23:45), 編輯推噓2(2010)
留言12則, 3人參與, 最新討論串1/1
這幾天寫嵌入式系統遇到這個問題 假設一個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.htmlCCT63:轉錄至看板 ASM 04/15 23:45

04/16 00:27, , 1F
compiler優化選項開下去後大概都一樣吧
04/16 00:27, 1F

04/16 00:28, , 2F
從演算法下手對速度常常比較有感,除非是超內圈的loop
04/16 00:28, 2F

04/16 00:28, , 3F
現在的編譯器技術是能夠做到即使寫 B[3*i]=A[i];
04/16 00:28, 3F

04/16 00:29, , 4F
還是能編出像原 PO 這邊這麼寫的機器碼的
04/16 00:29, 4F

04/16 00:29, , 5F
或你是embed system類沒DMA的,不然在這種地方大概摳
04/16 00:29, 5F

04/16 00:30, , 6F
呃, 應該是 B[i] = A[3*i]; XD 不過意思有到就是
04/16 00:30, 6F

04/16 00:30, , 7F
不出速度來
04/16 00:30, 7F

04/16 00:31, , 8F
這裡的問題我猜跟 A[3*i] 存取位址是 6 的倍數有一點點關係
04/16 00:31, 8F

04/16 00:32, , 9F
6 的倍數表示大概要四圈才會有一個 aligned address
04/16 00:32, 9F

04/16 00:33, , 10F
咦還是兩圈就有? 總之或許這裡有一點關係在
04/16 00:33, 10F

04/16 10:02, , 11F
看看特殊指令級有沒有支援 比如Neon一次可以搬蠻大量的
04/16 10:02, 11F

04/16 10:03, , 12F
資料 加上loop unrolling試看看
04/16 10:03, 12F
文章代碼(AID): #1LBeU3ZJ (C_and_CPP)