2013-03-02 106 views
2

我想優化一段正在運行CRC32檢查的代碼。CRC32C SSE vs BOOST

對於測試緩衝,我做了以下內容:

char *buff = new char[1024]; 
for (int i = 0; i < 1024; ++i) 
    buff[i] = i; 

目前,我使用升壓轉換器的CRC執行如下命令:

boost::crc_optimal<32, 0x1EDC6F41, 0, 0> crc; 
crc.process_bytes(buff, 1024); 
unsigned int boostCRC = crc(); 

這意味着多項式「0x1EDC6F41」與初始值爲0,最後的異或爲0.

然後,我寫了crc32c算法的最簡單的sse4.2版本:

unsigned int sseCRC = 0; 
for (char *iter = buff, *end = buff + 1024; iter != end; ++iter) 
    sseCRC = _mm_crc32_u8(sseCRC, *iter); 

問題是,最終值不匹配,即使多項式應該是相同的。有沒有人有這方面的經驗?我對sse版本做錯了什麼?

+0

這幾乎肯定是一個排序問題。我無法通讀這兩個函數的文檔,但我建議你這樣做(非常仔細!),並檢查它們如何確定字節序。 – 2013-03-02 14:02:02

+2

[你有什麼試圖自己調試嗎?](http://whathaveyoutried.com/) – jalf 2013-03-02 14:04:52

+1

由於SSE版本是固定的多項式,我能想到的最好的辦法是將boost多項式翻轉爲0x416FDC1E,以及做像處理完第一個字符後檢查結果,他們立即發生分歧。我最大的問題是關於sse版本的信息非常稀少,所以我希望有人可能會從我的個人經驗中得到答案,試圖在開始深入研究檔案之前使用sse版本來啓發我。 – Mranz 2013-03-02 15:00:22

回答

4

根據Intel® SSE4 Programming Reference,CRC指令進行位反射,默認在升壓CRC模板中關閉。使用的

boost::crc_optimal<32, 0x1EDC6F41, 0, 0, true, true> crc; 

代替

boost::crc_optimal<32, 0x1EDC6F41, 0, 0> crc; 

會產生相同的校驗和的SSE版本。

相關問題