在 Intel CPU 上选择 32 位和 64 位固有 CRC

Posted

技术标签:

【中文标题】在 Intel CPU 上选择 32 位和 64 位固有 CRC【英文标题】:Choosing between 32 and 64 bit intrinsic CRC on Intel CPU 【发布时间】:2014-10-12 06:26:33 【问题描述】:

我需要计算 CRC 以便在 INTEL 机器上形成哈希函数,并提出以下两个内在函数:

    _mm_crc32_u32 _mm_crc32_u64

在我的项目中,我正在处理 32 位变量,我的困境是在对每两个变量进行移位和 OR 运算(从而创建一个 64 位变量)然后使用 64 位 CRC 或运行 32 位 CRC在两个 32 位变量中的每一个上。

我无法在任何地方找到这些函数中的每一个所占用的周期数,并且从英特尔函数规范中不清楚哪一个更可取。

同样的困境也适用于 16 位版本的 CRC 函数:

_mm_crc32_u16

我尝试通过检查 CRC 前后的时间来检查它。结果几乎相同。所以我需要一种更复杂的计算方法。

【问题讨论】:

如果您想对替代方案进行基准测试,可以从这里开始:***.com/questions/15752770/… _mm_crc32_u64 不适用于 32 位版本。 【参考方案1】:

不要将 CRC 用于哈希值。这不是一回事。 使用murmurhash 满足经典的计算机科学散列需求(即,不是巨大的加密强度散列)。这也有不同宽度的实现。

我不明白你的意思:你有两个 32 位值并想要一个哈希值?这可能是明智的,也可能不是,取决于原因。你能澄清一下你想要完成什么吗?

【讨论】:

嗨,我想尽可能多地保存周期,我的困境是在两个 32 位值上使用两次 32 位 CRC 还是使用移位和 OR 将它们组合成一个 64 位值并运行 CRC对它起作用。我认为问题可以归结为 64 位和 32 位 CRC 或移位和 OR 操作之间的差异更大。我使用 crc 的原因是因为它具有内在功能 重复同样的事情并没有帮助。只有 32 位输入的 CRC 有什么意义?这就是你的意思吗?为什么要将输入大小和 CRC 长度配对?这让我觉得我不明白。 CRC 在当前处理器上不快,因为它使用一个表。解释不同于“两个 32 位值”或显示一个示例。 @Anton.P:你试过测量性能吗?哪一个对你来说更快?确保当其他人从第一个已经运行的情况下受益时,您不会因缓存未命中而受到惩罚。您计算 CRC 的数据量有多大?对齐程度如何? @jdlugosz "CRC 在当前处理器上并不快" - 在 Intel 处理器上每 64 位吞吐量有 1 个周期。这实际上相当快。 @Mysticial 所以他所说的“内在”是指新的 CPU 有一个特殊的指令?我不知道。我以为他的意思是编译器支持。

以上是关于在 Intel CPU 上选择 32 位和 64 位固有 CRC的主要内容,如果未能解决你的问题,请参考以下文章

Java千百问_01基本概念(016)_32位和64位计算机有什么区别

Xcode 仅针对 Intel 32-64bit 编译

Intel开发手册下载地址

32位和64位系统的区别

#yyds干货盘点# 面试官:说说32位和64位

目前计算机上主流的Windows操作系统分为32位和多少位?