在上期,我们讲述了古墓丽影和挖矿之间的关系,那么,为什么GPU会用来作为“挖矿”呢?
不妨让我们直切业务的本质。
上期讲到,“挖矿”的本质,是用暴力穷举法计算出一个方程的根: SHA256 (String) = 0;
SHA256的算法是什么样的呢?
它是一种所谓的散列算法,又称为摘要算法。它的特点是:
- 对源字串的少量修改会导致计算结果的显著变化;
- 无论源字串长度和内容,最终计算结果的bit数恒定;
让我们举一个例子:
“庆祝中国共产党诞辰101周年暨香港回归25周年” 的sha256为:
fe620d371c6411521e10b8ce0887f42d51bd3bd389df2ab692b00c1c820fa385
而
“庆祝中国共产党建党101周年暨香港回归25周年”的sha256为:
40597fe5a0a85c7372e7a721a15fedbb6b6905f721ca52f9e5fa85feccca9e6a
可见,sha256源字符串的很小的变动,会对计算结果造成很大的影响。
让我们来看一看sha256的计算流程:
- 如源串长度不满足512 bit,则填充至512 bit;如多于512 bit,则拆分为512 bit的块(chunk),并将最后一块填充至512 bit;
- 将第一个512 bit块拆分为8个32bit的字 (WORD);
- 用初始向量初始化8个32bit的字:a, b, c, d, e, f, g, h;
- 应用SHA256的压缩函数更新a到h,如果有N个消息块,就更新N次;
5. 得到Hash值。
如图,图中的C为压缩函数 (Compression Function)。
压缩函数的计算流程如下图:
其中包含了大量的异或、补码等运算。
如果我们使用CPU编程计算SHA256,源码见: https://github.com/dmarman/sha256algorithm/blob/main/src/classes/sha.js
可想而知地,每计算512bit的SHA256,需要付出的CPU Cycle数将以百万计。在度量SHA256算法算力时,常见的度量单位为HPS (Hash per second)。Intel Xeon E5-2680具有12核24线程,其算力大约在3500H/S。
因此,工程师们想到,利用GPU的高并发功能,让GPU的数千个CUDA核心来并发完成这样的并行计算。
这张图是NVidia A100 GPU的内部架构简图。由于图片比例的原因,大家只能看到深绿色的密集小框。
让我们放大再看:
整个GPU有8个GPC,每个GPC有16个SM。
每个SM里面有这些:
每个SM内部有4个Tensor core,每个Tensor Core在时钟周期内能够执行1024次32bit的整数或浮点运算。
这样,在运算效率上,A100 GPU实际上能提供16*8*4*1024 = 512K倍并发加速。
由于A100的高昂价格,实际上没有人用它来计算SHA256 (也就是挖矿)。实践中,它的娱乐版本RTX3090Ti的算力约为134MH/s,也就是每秒可以执行1.34亿次SHA256运算。
这就是软硬件融合的魅力所在!
我们注意到,SHA256运算主要使用的是逻辑指令与整数运算指令。而GPU的Cuda核中,更多的面积是用于浮点数乘加指令,也就是执行这样的运算:
RX = RX RY * RZ
显然,对于神经网络等批量计算向量叉积的运算,才可以充分发挥GPU的能力,而用于算Hash属于对CPU能力的严重浪费。因此,工程师们又开发出了ASIC Hash算法芯片,利用专用芯片计算SHA256,来实现所谓的“挖矿”。
当然,在有关部门对非法金融活动的打击下,这一切也最后成为了一场幻梦。
对密码学算法有一定了解的读者会意识到,SHA256实际上是一种密码学中非常重要的算法,在数字签名等场景中有着广泛的应用。由于云计算时代,分布式应用之间的通讯往往使用https,grpc over TLS等方式,SHA256这样的Hash算法,在验证签名等环境是必备的。
比SHA256这样的Hash算法更重要的是数据平面加解密算法。
AES256是常见的一种加解密算法。它的每次运算可以实现256bit的数据在明文和密文之间转换,加密和解密使用相同的密钥,因此被称为“对称密钥算法”。与此对应的还有“非对称密钥算法”,如RSA等。无论是对称密钥算法还是非对称密钥算法,https,ssh,TLS等加密通讯中,每次数据包的收发都需要执行至少一次密钥算法。
如果通过软硬件融合的方式,让这些密钥算法不再耗费CPU的指令资源,在云计算等分布式应用场景中,就可以大大提升计算资源的利用率,从而解放生产力,发展生产力!
请看下篇——