CRC-32C (Castagnoli) 算法是 iSCSI 和SCTP 数据校验的算法,和常用CRC-32-IEEE 802.3算法所不同的是多项式常数CRC32C是0x1EDC6F41 ,CRC32是0x04C11DB7 ,也就是说由此生成的CRC表不同外算法是一模一样.
CRC32 常规算法如下:
CRC32C使用SSE4.2硬件指令优化算法部分代码如下:
以上2个不同实现方式在Intel Core i7 720QM 1.60GHz CPU上测试成绩如下:
(数据采用随机算法生成,1M*100表示使用1M数据进行100次重复计算,数据量相当于100M)
--------------------------------------------------------------------------------------
| 数据量 | 常规算法时间 | 优化算法时间 | 快出百分比 |
--------------------------------------------------------------------------------------
| 1M *100 | X86 Time:390ms | SSE Time:32ms | 1218% |
--------------------------------------------------------------------------------------
| 4M *100 | X86 Time:1575ms | SSE Time:156ms | 1009% |
--------------------------------------------------------------------------------------
| 8M *100 | X86 Time:3136ms | SSE Time:280ms | 1120% |
--------------------------------------------------------------------------------------
| 32M *100 | X86 Time:12542ms | SSE Time:1092ms | 1148% |
--------------------------------------------------------------------------------------
通过对比可以清楚的看到使用SSE4.2中的新指令crc32可以比常规CRC32C算法要快出最少10倍的效率,Intel新增的指令确实对常规某些算法提供了高效的解决方案,使用好它们将对我们在以后的开发中得到质的提升。
本例测试DEMO: http://download.csdn.net/source/3361729
*References intel sse4 programming reference (D91561-001)
http://software.intel.com/file/18187/