在ARM上的Golang中将SHA256加速100倍
作为加密扩展的一部分,64位ARMv8内核引入了SHA1和SHA2加速的新指令。Minio我们对这些说明可能产生的差异感到好奇,这有时是您有时会得到的惊喜之一。
我们已经在miniNodes.com上运行ARMv8服务器,如果您查看CPU信息,将会看到以下内容:

如您所见,它很好地列出了sha1和sh2功能,后者是本博客文章的主题。
作为minio / sha256-simd存储库的一部分,我们添加了arm64 Golang汇编版本,其摘录如下所示(仅一个循环,即多个循环):

我们将该版本与Go中现在可用的默认实现进行了比较。事不宜迟,以下是Benchcmp报告的结果:

当然,这是从(微不足道的)6 MB /秒(每核)大幅增加到615 MB /秒。公平地说,Go on ARM的默认实现不会以任何方式加速(例如,对于具有汇编版本的Intel CPU,这是不同的)。如果已组装,则差异会小很多,但由于新的sha256h,sha256h2,sha256su0和sha256su1指令,我们认为该差异仍然最小10倍。
可以从minio / sha256-simd存储库的名称中得出,是的,我们正在努力在Intel上增加对SHA256的SIMD(AVX2,AVX和SSE风格)支持,因此敬请期待。尽管我们不保证Intel的速度提高100倍……
有趣的是,实际上有与ARM等效的Intel SHA扩展。Linux 4.4增加了对此的支持,但到目前为止,我们还无法确定将实际运行此代码的任何CPU 。如果您愿意,请告知我们,在广泛支持下,我们实际上有兴趣将其添加到minio / sha256-simd中。
最后,我们最初开发的用于协助minio / blake2b-simd的asm2plan9s工具已通过ARM支持进行了扩展(除了已经可用的Intel)。
敏锐的读者可能已经注意到ARMv8还有一个有趣的功能,即PMULL(多项式乘法)。该说明可能对Reed Solomon擦除编码非常有帮助。我们在XL版本的Minio中使用了此技术,以确保额外的安全性并防止钻头腐烂。因此,请继续关注。