1.基于SSE4.2的源码加速计算crc32-c的一个小技巧
基于SSE4.2的加速计算crc32-c的一个小技巧
CRCc,即CRC-Castagnoli,源码这一算法在iSCI协议中应用广泛,源码因此也被称为crc_iscsi。源码phpcurl获取源码许多CPU架构提供了硬件加速,源码如AMD的源码sse4.2中,crc指令专门用于加速CRCc运算。源码在Intel的源码实现中,执行一次crc指令需要3个周期。源码然而,源码通过合理利用CPU的源码微许愿源码流水线特性,可以将三个连续的源码crc指令的执行周期缩短至接近1周期,从而实现加速。源码
对于大型数据块,源码传统的源码逐段计算方法不再适用。通过巧妙地利用CRC运算的文章详情源码性质,可以将计算过程优化。假设CRC(I, X)为CRC计算函数,其中I为初始值,X为待计算数据。在有ABC三个相同长度K的游戏外挂源码数据段时,可以分别计算CRC(I, A)、CRC(0, B)、CRC(0, C),利用CRC指令将数据流合并计算,从而避免CPU流水线排空,7 -zip 源码实现平均周期内计算一次数据。
计算完成后,将三组数据联合起来,通过CRC(I, AB) = CRC(CRC(I, A), O) xor CRC(0, B)公式进行聚合,其中O代表长度与A、B、C相同的全零数据段。通过crc指令直接计算CRC(X, 0)(X=CRC(I,A))可以进一步加速过程,尽管仍可能存在CPU停顿。
为优化聚合过程,可利用CRC运算的另一性质,即将初始值长度位拆分为4个2^8大小的表,从而将大表查询法转化为4个小表查询法,加速计算过程。通过同样的方法聚合CRC(I, AB)和CRC(0, C),最终在使用Intel CPU计算CRCc时,速度可提升接近三倍。