【问题标题】:What is the correct way of calculating a large CRC32计算大CRC32的正确方法是什么
【发布时间】:2012-05-07 05:07:22
【问题描述】:

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

【问题讨论】:

标签: c x86-64 sse crc32


【解决方案1】:

引用您文章中提到的intel white paper

而不是使用传统的计算整个消息的 CRC 线性方法,我们使用更快的方法来分割任意长度 缓冲到一些较小的固定大小的段,计算 CRC 这些片段平行,然后是重组步骤 使用段的部分 CRC 计算有效 CRC。

还有,

CRC的最终重组增加了开销,可以 使用 Nehalem 微架构上的查找表实现 - 我们 展示如何用尽可能少的表格做到这一点,同时给予 在尺寸范围内具有出色的整体性能。 PCLMULQDQ Westmere 微架构中的指令允许高效 没有查找表的 CRC 重组。各种方法是 本文通过真实的代码示例进行了详尽的解释。

所以你需要详细研究这篇论文: 使用 CRC32 指令对 iSCSI 多项式进行快速 CRC 计算

【讨论】:

  • 看来你读过那篇文章很有兴趣:)!
【解决方案2】:

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

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

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

要覆盖最终结果大于0xffffffff 的情况,只需在最终计算后执行crc32 = ~crc32 & 0xffffffff

【讨论】:

  • 好的,所以只需将前一个 CRC 传递给下一个调用。没问题!
  • 这比 Pavan 描述的技术更简单,但是当然如果你这样做,那么你就不能并行化不同的块,它们必须按顺序处理。也就是说,我个人从来没有觉得需要并行化校验和计算,一个内核应该对任何人都足够了 ;-)
猜你喜欢
  • 1970-01-01
  • 2017-03-05
  • 2015-04-12
  • 2021-05-29
  • 1970-01-01
  • 1970-01-01
  • 2015-04-14
  • 1970-01-01
  • 2011-01-17
相关资源
最近更新 更多