網際校正和演算法特性
佟強 2008.10.20
交換率和結合律:由於在累加的過程中,重要的只是位元組的位置是奇數位還是偶數位,所以只要不混亂位元組的奇偶位,相加可以任何順序進行,加數之間也可以任意進行結合。
( [A,B] +' [C,D] +' ... +' [G,0] ) +' ([0,H] +' ... +' [Y,Z])
位元組順序獨立:進行累加的過程中,16位中的高8位和低8位的位置可以互換,即可以使用高位元組優先的順序,也可以使用低位元組優先的順序進行累加,只要保證參與運算的各個16位位元使用相同的表示順序即可。如果運算時交換了高低位元組,最終得到的結果也要進行一次高低位元組的翻轉。
[B,A] +' [D,C] +' ... +' [Z,Y]
為什麼會出現這樣的結果呢?因為兩種順序獲得的進位是相同的。都是從第15位到第0位進位以及從第7位到第8位進位。也就是說,交換位元組位置只是改變高低位元組的排列順序,但沒有改變它們的內在聯絡。
並行計算:在字寬為16位倍數的機器裡,可以利用並行計算更為有效地實現上述演算法。例如在32位機器上,可以4個位元組為單位計算:
[A,B,C,D] +' [E,F,G,H] +' ...
最後將32位的結果“摺疊”成16位即可。當然,新產生的進位仍然要迴圈累加到低位上。
同樣,位元組的順序也不重要。可以用[D,C,B,A] +' [H,G,F,E]+' ... 計算。也可以用[B,A,D,C] +' [F,E,H,G] +' ... 計算,只需將和的位元組順序做相應的交換即可。
延遲進位:延遲進位的意思是等所有資料累加結束後再把進位值迴圈累加到低位。它的一種實現方法就是用32位的累加器獲得16位校正和,這樣進位就儲存在高16位上。這種方法避免了累加器中進位感應器的設定,但是它要求的容量是原來的累加器容量的兩倍,因此更多低依賴於硬體條件。
資料讀入與校正合二為一:由於資料讀入和計算校正和都需要擷取資料,二者都需要佔用儲存匯流排的頻寬,因此它們的瓶頸都在於儲存匯流排資料讀取的速度。如果把資料的讀入過程與校正過程合二為一,即在讀入資料的同時計算校正和,這樣可以省去一次資料讀取過程,從而提高校正和的計算效率。
增量式更新:對於已經計算過校正和的資料,如果有部分位元組的值發生了變化,需要重新計算校正和,則不需要對全部資料進行計算。要做的僅是從原先的累加和中減掉發生變化位元組的原數值,然後再加上它的新數值,即加上這兩個值的差。假設C為修改前的校正和,m為修改前的數值,m'為修改後的數值,則修改後的校正和C'為:
C' = C + (-m) +m' = C + (m'-m)