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

Fast CRC using PCLMULQDQ - final reduction of 128 bits

我一直在尝试按照此处所述实现 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位

是否需要按照前面折叠的模式,将这些结果与起始 128 位的低 64 位进行异或运算?论文中的图8没有具体说明,我对图中数据的对齐方式感到困惑。

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

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

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

然后使用 Barrett 算法从 160 位实体的低 64 位生成 32 位 CRC(其中低 32 位最初附加了零)。


为了解释巴雷特算法,将64位视为被除数,将CRC多项式视为除数。则余数=被除数-(⌊被除数/除数⌋·除数)。使用 pclmulqdq 而不是实际除法,并且 ⌊ 股息 / 除数 ⌋ = (股息 · ⌊ 2^64 / 除数 ⌋) >> 64.