64 位 ARMv8 内核在 加密扩展 中引入了用于 SHA1 和 SHA2 加速的新指令。我们 Minio 团队很好奇这些指令会带来什么差异,事实证明,这正是您有时会遇到的令人愉快的 惊喜 之一。
我们一直在 miniNodes.com 上运行一个 ARMv8 服务器,如果您查看 CPU 信息,您将看到以下内容:

如您所见,它很好地列出了 sha1 和 sh2 功能,其中后者是本文的主题。
作为 minio/sha256-simd 代码库的一部分,我们添加了一个 arm64 的 Golang 汇编版本,下面显示了其中一部分代码(仅一个循环中的一个周期):

我们将此版本与 Go 中现在可用的默认实现进行了比较。毫不犹豫,以下是 benchcmp 报告的结果:

当然,这是一个巨大的提升,从(微不足道的)6 MB/秒到 615 MB/秒(每个核心)。公平地说,Go 在 ARM 上的默认实现并没有以任何方式加速(不像例如 Intel CPU 那样有汇编版本)。如果它使用汇编语言编写,那么差异会小很多,但我们认为仍然至少是 10 倍,这要归功于新的 sha256h、sha256h2、sha256su0 和 sha256su1 指令。
正如您可能从 minio/sha256-simd 代码库的名称中推断的那样,是的,我们正在努力为 Intel 上的 SHA256 添加 SIMD(AVX2、AVX 和 SSE 版本)支持,敬请期待。不过,我们不承诺 Intel 的速度提升能达到 100 倍…
有趣的是,Intel 实际上也存在与 ARM 等效的 SHA 扩展。Linux 4.4 已添加对 此功能 的支持,但到目前为止,我们还没有能够识别出任何实际 *运行* 此代码的 CPU。如果您有,请告知我们,如果支持范围更广,我们实际上会考虑将其添加到 minio/sha256-simd 中。
最后,我们最初开发用于协助 minio/blake2b-simd 的 asm2plan9s 工具正在扩展 ARM 支持(除了现有的 Intel 支持之外)。
敏锐的读者可能已经注意到,ARMv8 还有一个有趣的特性,即 PMULL(多项式乘法)。此指令可能非常有助于 Reed Solomon 擦除编码。我们将在 Minio 的 XL 版本中使用此技术,以确保额外的安全性和防止位腐烂的保护。敬请期待。