2

是一篇文章,描述了如何使用现代 x86-64 处理器中的内置 CRC32 指令计算最大 1024 字节的 CRC32。但是,我需要计算超过 1024 字节的 CRC32。计算每个 1024 字节块的 CRC32 并最终将它们相加是正确的方法,还是不正确?如果是这样,正确的方法是什么?

4

2 回答 2

5

引用您的文章提到的英特尔白皮书

我们不是使用传统的线性方法计算整个消息的 CRC,而是使用更快的方法将任意长度的缓冲区拆分为多个较小的固定大小的段,并行计算这些段上的 CRC,然后是计算使用段的部分 CRC 的有效 CRC 。

还,

CRC 的最终重组增加了开销,并且可以使用 Nehalem 微架构上的查找表来实现——我们展示了如何使用尽可能少的表来实现这一点,同时在大小范围内提供出色的整体性能。Westmere 微架构中的 PCLMULQDQ 指令允许高效重组 CRC,而无需查找表。本文通过真实的代码示例对各种方法进行了详尽的解释。

所以你需要详细研究这篇论文: Fast CRC Computation for iSCSI Polynomial Using CRC32 Instruction

于 2012-04-26T13:05:35.827 回答
4

不,只是添加不会完成这项工作。

您链接的文章告诉我们如何做到这一点:

一次计算的 CRC 输出用作下一次计算的初始 CRC [...]

为了涵盖最终结果较大的情况,然后0xffffffffcrc32 = ~crc32 & 0xffffffff最终计算之后进行。

于 2012-04-26T13:09:18.150 回答