使用BLAKE2在Golang中快速散列

使用BLAKE2在Golang中快速散列

在此博客中,我们想为SIM中的BLAKE2哈希算法提供一种优化的实现blake2b-simd,该算法利用了SIMD指令。与(非汇编)Go实施相比,它的速度提高了4倍,并且在高端CPU上,每个内核的散列速度可达到接近1 GB /秒与标准的SHA512实现相比,它的性能大约提高了3倍。

提供三种口味,即AVX2,AVX和SSE(自动选择最佳一种)。下面的列表显示了它们与(非汇编)Go实现的比较:

  • AVX2:3.94倍

  • AVX:3.28倍

  • 上证指数:2.85x

与其他哈希技术的比较

以下是对几种哈希技术及其以MB / s为单位的处理速度以及BLAKE2b(AVX2版本)的性能改进的比较。

MD5    : 607.48 MB/s  (1.4x)
SHA1   : 522.94 MB/s  (1.6x)
SHA256 : 189.58 MB/s  (4.5x)
SHA512 : 306.33 MB/s  (2.8x)
BLAKE2b: 850.64 MB/s

防位腐蚀

Minio(适用于XL版本)上,我们使用擦除编码来防止数据丢失。将对象分割(默认情况下)为8个数据块和8个奇偶校验块,总共16个硬盘。这意味着(在极少数情况下)即使丢失了8个硬盘,仍然有可能重建原始对象并将其返回给用户(请注意,当然可以更换硬盘,然后将其自动重建) )。

为了防止随时间推移发生位腐烂,Minio通过计算数据块的哈希值并将其与最初计算的哈希值进行比较,来验证从磁盘读取的任何数据块的完整性。只有在两个哈希值都相同的情况下,才能保证数据没有以任何方式被更改(因此可以安全地返回给客户端)。如果哈希值之间存在任何差异,则该块本身将被丢弃,并且必须从其他数据和奇偶校验块中进行重建。

由于此验证步骤是非常频繁的操作,因此很明显,哈希技术的性能对整体系统性能有很大影响。因此,Minio投资了一种尽可能快而可靠的哈希技术,并发现BLAKE2是一个不错的选择。

这还给谁呢?

除了位腐烂保护之外,还有许多其他用于快速哈希处理的软件用例。在这里,您可以考虑存储系统中的重复数据删除,入侵检测,版本控制系统和完整性检查。同样,在这些应用程序中,哈希是一项非常频繁的任务,因此,此处可获得的任何性能提升都将对整体性能产生重大影响。

asm2plan9s

初始版本基于BLAKE2一部分的参考SSE实现由于Go Assembly中仅部分支持AVX / SSE指令,因此我们开发了一种名为asm2plan9s的简单工具,可帮助将指令汇编为等效的BYTE代码。

在后台,该工具使用yasm一步一步地汇编每条指令,并将获得的字节码插入源代码文件。

例如,采用以下AVX指令(保存在文件example.s中)

// VPADDQ  XMM0,XMM1,XMM8

通过运行$ asm2plan9s example.s,此文件将转换为

LONG $0xd471c1c4; BYTE $0xc0   // VPADDQ  XMM0,XMM1,XMM8

根据指令的不同,将有更多或更少的LONG,WORD和/或BYTE。此外,它支持在定义中使用,有关更多信息,请参见GitHub上的项目。

技术细节

BLAKE2b是一种对64位整数值进行操作的哈希算法。AVX2版本使用256位宽的YMM寄存器,以便实质上并行处理四个“ Golang”操作。AVX和SSE在128位XMM寄存器上运行(并行执行两个操作)。以下分别摘自compressAvx2_amd64.s,compressAvx_amd64.s和compress_generic.go文件的源代码。

AVX2:

VPADDQ  YMM0,YMM0,YMM1   /* v0 += v4,v1 += v5,v2 += v6,v3 += v7 */

AVX:

VPADDQ  XMM0,XMM0,XMM2   /* v0 += v4, v1 += v5 */VPADDQ  XMM1,XMM1,XMM3   /* v2 += v6, v3 += v7 */

高朗:

v0 += v4
v1 += v5
v2 += v6
v3 += v7

说明中显示的并行性将很明显。由于其他限制,例如内存访问,缓存等,当从AVX转到AVX2时,无法获得2倍的完整(理论上)改进,但随着时间的流逝,差异实际上可能会扩大。(请注意,这些天的编译器还尝试对操作进行向量化。)

结论

我们希望您会发现此项目有用。前往GitHub上的blake2b-simd进行检查。让我们知道您的想法。


上一篇 下一篇