Re: [心得] Loop unrolling, Duff's device

看板C_and_CPP作者時間16年前 (2009/06/28 16:42), 編輯推噓2(200)
留言2則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《FRAXIS (喔喔)》之銘言: : 不過Duff's device的技巧就是可以把這兩個迴圈融合在一起。 : i = 0; : switch ( n % 5 ) { : case 0: do {sum += a[ i++ ]; : case 1: sum += a[ i++ ]; : case 2: sum += a[ i++ ]; : case 3: sum += a[ i++ ]; : case 4: sum += a[ i++ ]; : } while ((n -= 5) > 0); : } 假設 n = 6,則 n % 5 是 1 所以第一次 loop 會加 a[0]~a[3] 4 個數 (case 1 ~ case 4) 第二次 loop 又加了 a[4]~a[8] 5 個數 這樣總共就加了 a[0]~a[8] 9 個數了 所以 case 那裡應該要反過來排才是對的 switch ( n % 5 ) { case 0: do {sum += a[ i++ ]; case 4: sum += a[ i++ ]; case 3: sum += a[ i++ ]; case 2: sum += a[ i++ ]; case 1: sum += a[ i++ ]; } while ((n -= 5) > 0); } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.30.49 ※ 編輯: HuangTzHuan 來自: 140.112.30.49 (06/29 00:43)

06/29 00:49, , 1F
現在 compiler 很威的,還會辨識出不好的 unrolling
06/29 00:49, 1F

06/29 07:59, , 2F
筆誤了..謝謝
06/29 07:59, 2F
文章代碼(AID): #1AHvreYK (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1AHvreYK (C_and_CPP)