達夫設備

http://www.oschina.net/question/583160_66329併發


void send_duff(char *to, char *from, int count) {         int  n = (count + 7) / 8;         switch(count % 8) {         case 0: do {    *to++ = *from++;         case 7:         *to++ = *from++;         case 6:         *to++ = *from++;         case 5:         *to++ = *from++;         case 4:         *to++ = *from++;         case 3:         *to++ = *from++;         case 2:         *to++ = *from++;         case 1:         *to++ = *from++;                 } while(--n > 0);         } }

一、咱們但願不經過一個char  ,一個char的傳遞。儘量利用已有可控的帶寬。例如64位系統,咱們就用64位傳遞。128位系統,就用128傳遞,固然這個和數據存儲位置也有關係。有的系統,外部MEM到片上是32位的,而片內L2到TCM是64位的。而TCM到寄存器是128位的。同時你是 C語言設計程序,仍是設計DMA等總線控制器的一部分也不同。但基本精神不變,就是最大化的利用可控的軟硬件資源。落到C程序上,就是儘量使用編譯器能支持的大位寬數據類型。ide

二、因爲函數接口要求,對大位寬,例如64位或32位,沒有任何約束,包括起始地址邊界對齊問題和傳輸量的問題。所以須要分別對待。函數

三、首先須要關注傳輸量的問題。性能

四、其次關注起始地址偏移量不一樣的問題。spa

五、實際在循環中反覆的,存在一個位移的事情,例如一次可傳輸64位,則須要兩組64位數據,根據源地址,和目標地址偏移量的差值作適當位移,向左向右,須要根據實際偏移量哪一個大,還有計算機的大數在前仍是小數在前的狀況,實際肯定。.net

基本思想就是這樣,不用擔憂數據COPY中存在移位等計算。計算機有pipeline的,數據預讀和存儲與這些計算都是能夠併發操做的。因此總體性能遠比char 一個個傳的快。雖然char一個個傳,如上面代碼那樣,看似乾淨,但落到實際系統執行時,也仍是須要依次等待內部總線可利用。除非編譯器自動識別,產生了DMA的機理操做。貌似除了特定書寫規範的代碼,按照編譯器的要求來書寫,不然編譯器沒法實現這種動態識別。設計

相關文章
相關標籤/搜索