首先,利用傳統的軟體技巧來最佳化演算法,然後將其轉向定製指令以加速演算法。我們將討論不同實現方法的效能比較和折衷。CRC演算法可用來校驗資料在傳輸過程中是否被破壞。這些演算法很流行,因為它們具有很高的檢錯率,而且不會對資料吞吐量造成太大影響,因為CRC校驗位被新增進資料資訊中。但是,CRC演算法比一些簡單的校驗和演算法有更大的計算量要求。儘管如此,檢錯率的提高使得這種演算法值得去實施。一般說來,傳送端對要被髮送的訊息執行CRC演算法,並將CRC結果新增進該訊息中。訊息的接收端對包括CRC結果在內的訊息執行同樣的CRC操作。如果接收端的結果與傳送端的不同,這說明資料被破壞了。CRC演算法是一種密集的數學運算,涉及到二元模數除法(modulo-2 division),即資料訊息被16或32位多項式(取決於所用CRC標準)除所得的餘數。這種操作一般透過異或和移位的迭代過程來實現,當採用16位多項式時,這相當於每資料位元組要執行數百條指令。如果傳送數百個位元組,計算量就會高達數萬條指令。因此,任何最佳化都會大幅提高吞吐量。程式碼列表1中的CRC函式有兩個自變數(訊息指標和訊息中的位元組數),它可返回所計算的CRC值(餘數)。儘管該函式的自變數是一些位元組,但計算要逐位來執行。該演算法並不高效,因為所有操作(與、移位、異或和迴圈控制)都必須逐位地執行。列表1:逐位執行的CRC演算法C程式碼。/** The width of the CRC calculation and result.* Modify the typedef for a 16 or 32-bit CRC standard.*/typedef unsigned char crc;#define WIDTH (8 * sizeof(crc))#define TOPBIT (1 0; "bit){/** Try to divide the current data bit.*/if (remainder & TOPBIT){remainder = (remainder 0; "bit){/** Try to divide the current data bit.*/if (remainder & TOPBIT){remainder = (remainder > (WIDTH - 8));remainder = crcTable[data] ^ (remainder
首先,利用傳統的軟體技巧來最佳化演算法,然後將其轉向定製指令以加速演算法。我們將討論不同實現方法的效能比較和折衷。CRC演算法可用來校驗資料在傳輸過程中是否被破壞。這些演算法很流行,因為它們具有很高的檢錯率,而且不會對資料吞吐量造成太大影響,因為CRC校驗位被新增進資料資訊中。但是,CRC演算法比一些簡單的校驗和演算法有更大的計算量要求。儘管如此,檢錯率的提高使得這種演算法值得去實施。一般說來,傳送端對要被髮送的訊息執行CRC演算法,並將CRC結果新增進該訊息中。訊息的接收端對包括CRC結果在內的訊息執行同樣的CRC操作。如果接收端的結果與傳送端的不同,這說明資料被破壞了。CRC演算法是一種密集的數學運算,涉及到二元模數除法(modulo-2 division),即資料訊息被16或32位多項式(取決於所用CRC標準)除所得的餘數。這種操作一般透過異或和移位的迭代過程來實現,當採用16位多項式時,這相當於每資料位元組要執行數百條指令。如果傳送數百個位元組,計算量就會高達數萬條指令。因此,任何最佳化都會大幅提高吞吐量。程式碼列表1中的CRC函式有兩個自變數(訊息指標和訊息中的位元組數),它可返回所計算的CRC值(餘數)。儘管該函式的自變數是一些位元組,但計算要逐位來執行。該演算法並不高效,因為所有操作(與、移位、異或和迴圈控制)都必須逐位地執行。列表1:逐位執行的CRC演算法C程式碼。/** The width of the CRC calculation and result.* Modify the typedef for a 16 or 32-bit CRC standard.*/typedef unsigned char crc;#define WIDTH (8 * sizeof(crc))#define TOPBIT (1 0; "bit){/** Try to divide the current data bit.*/if (remainder & TOPBIT){remainder = (remainder 0; "bit){/** Try to divide the current data bit.*/if (remainder & TOPBIT){remainder = (remainder > (WIDTH - 8));remainder = crcTable[data] ^ (remainder