使用PCLMULQDQ进行快速CRC - 最终减少128位

时间:2016-10-03 16:21:42

标签: intel crc

我一直在尝试实现CRC32计算算法,如下所述: http://www.intel.com/content/dam/www/public/us/en/documents/white-papers/fast-crc-computation-generic-polynomials-pclmulqdq-paper.pdf;我对第3步感到困惑,从128位减少到64位。希望有人可以为我澄清这些步骤:

  1. 将剩余的128位的高64位乘以常数K5,结果为96位
  2. 将96位的高64位乘以常数K6,结果为64位
  3. 这些结果是否需要与起始128位的低64位进行异或,遵循前一次折叠的模式?图8中没有说明,我对图中数据的对齐感到困惑。

1 个答案:

答案 0 :(得分:1)

图8显示最后的128位(工作余数x或缓冲区数据的最后128位)后跟32位附加零,因为crc32 =(msg(x)•x ^ 32)%p(x) 。所以你看到总共160位为64 | 32 | 32 | 32。

我的假设是高64位乘以K5,产生96位乘积。然后将该产品xor'ed到160位实体的低96位(记住低32位从32位附加零开始)。

然后将低96位的高32位(不是64位)乘以K6,产生64位乘积,该乘积与160位实体的低64位相乘。

然后,Barrett算法用于从160位实体的低64位产生32位CRC(其中低32位最初附加为零)。

为了解释Barrett算法,将64位视为被除数,将CRC多项式视为除数。然后余数=被除数 - (⌊被除数/除数⌋·除数)。而不是实际划分,使用pclmulqdq,并且⌊dividend / divisor⌋=(dividend·⌊2^ 64 / divisor⌋)>> 64。