CPU指令集 - SHA扩展 (SHA extensions)

  • Intel CPU的并行能力与浮点性能更强
  • AMD CPU支持SHA扩展, 计算SHA的性能更强

Intel CPU的浮点性能更强,是因为Intel的最大峰值性能凭借原生256bit向量指令集和寄存器的帮助,拥有对手两倍的峰值潜力,而AES是因为Intel明显偷懒,因为有了FMA而将乘加运算器依附于FMA运算器,使得乘加混合的计算峰值在无FMA指令集帮助下与对手没有优势,而SHA的性能,则是专用电路的胜利,但AMD的指令集也不是万能的,比如他不支持SHA-512,不过SHA-512用的少.

Lotus内检测并启用sha-ni功能的相关代码

看了下源码, 发现P1算法本身会检测CPU是否支持 sha extensions, 如果支持, 会采用加速算法.

rust-fil-proofs/sha2raw/src/platform.rs: 检测代码

#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]#[allow(unreachable_code)]pub fn sha_if_supported() -> Option<Self> {// Use raw_cpuid instead of is_x86_feature_detected, to ensure the check// never happens at compile time.let cpuid = CpuId::new();let is_runtime_ok = cpuid.get_extended_feature_info().map(|info| info.has_sha()).unwrap_or_default();#[cfg(target_feature = "sha")]{if !is_runtime_ok {println!("WARN: sha-ni not available, falling back");}}// Make sure this computer actually supports itif is_runtime_ok {return Some(Implementation(Platform::Sha));}None}

rust-fil-proofs/sha2raw/src/sha256_intrinsics.rs: SHA extensions 的实现代码

pub unsafe fn compress256(state: &mut [u32; 8], blocks: &[&[u8]]) {...
}

Benchmark 时的问题

如果将启用了加速算法的二进制文件放到intel上测试,会输出WARN: sha-ni not available, falling back,因为不支持sha extensions.

是什么原因导致此警告?
也许您应该使用支持sha-ni扩展的AMD CPU.

这是否意味着不能使用英特尔CPU运行平台?
由于型号AMD CPU具有SHA扩展,因此具有显着改进。

检查cpu是否支持 sha-ni 扩展

  1. [推荐]看less /proc/cpuinfo内是否有 sha_ni 字样 (intel的没有的)
cat /proc/cpuinfo | grep sha_ni
  1. 通过查找宏__SHA__,可以在Linux上的预处理器中检测SHA的可用性。-march=native将使其在处理器本机时可用。否则,您可以使用-msha启用它。 (intel的没有的)
$ gcc -march=native -dM -E - </dev/null | egrep -i '(aes|rdrnd|rdseed|sha)'
#define __RDRND__ 1
#define __SHA__ 1
#define __RDSEED__ 1
#define __AES__ 1
  1. 代码检测
//testcpu.cpp#include <iostream>int CheckForIntelShaExtensions() {int a, b, c, d;// Look for CPUID.7.0.EBX[29]// EAX = 7, ECX = 0a = 7;c = 0;asm volatile ("cpuid":"=a"(a), "=b"(b), "=c"(c), "=d"(d):"a"(a), "c"(c));// Intel® SHA Extensions feature bit is EBX[29]return ((b >> 29) & 1);
}int main(int argc, const char** argv) {int res = CheckForIntelShaExtensions();printf("CheckForIntelShaExtensions: %s \n", res==1?"true":"false" );return 0;
}

g++ testcpu.cpp -o testcpu && ./testcpu

  1. 可运行lotus/extern/filecoin-ffi/install-filcrypto 检测脚本
# 先修改`lotus/extern/filecoin-ffi/rust/rustc-target-features-optimized.json`
"rustc_target_feature": "+sha",
"check_cpu_for_feature": null
|
V
"rustc_target_feature": "+sha",
"check_cpu_for_feature": "sha_ni"# 再运行, 如果不支持sha,会提示 "your CPU does not support the"
./install-filcrypto

openssl speed 测试sha性能

A C/C++ programmer is probably best off using OpenSSL, which will use whatever CPU features it can to hash quickly. (Including SHA extensions on CPUs that have them, if your version of OpenSSL is new enough. >= v1.0.2)

  1. Generated a checksum of a big file with openssl
# 任意找一个几个G的大文件
$ time openssl dgst -sha256 /var/tmp/filecoin-proof-parameters/v27-stacked-proof-of-replication-merkletree-poseidon_hasher-8-0-0-sha256_hasher-6babf46ce344ae495d558e7770a585b2382d54f225af8ed0397b8be7c3fcd472.params
#这是intel的性能
openssl dgst -sha256   4.21s user 0.17s system 99% cpu 4.382 total
  1. openssl speed

这是intel的性能

$ openssl speed sha1
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes  16384 bytes
sha1            120593.54k   300683.29k   570650.03k   772621.99k   872868.52k   865457.49k$ openssl speed sha256
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes  16384 bytes
sha256           77305.80k   172220.71k   317703.34k   413427.71k   461886.81k   459887.96k

AMD的性能暂时没法测试(我的电脑是Intel的)

如果存在,OpenSSL会使用硬件加速。

使用基准测试OpenSSL speed SHA256,块大小为8KiB时,速度可以提高了550%。

对于加载到RAM的实际1GB和5GB文件,散列速度大约快3倍。

总结

  • 源码中P1算法本身会检测CPU是否支持 sha extensions, 如果支持, 会采用加速算法.
  • 如果将启用了加速算法的二进制文件放到intel上测试,会输出WARN: sha-ni not available, falling back,因为不支持sha extensions.
  • 如要看cpu是否支持sha extensions, 查看less /proc/cpuinfo返回的信息内是否有 sha_ni 字样.

往期精彩回顾:
区块链知识系列
密码学系列
零知识证明系列
共识系列
公链调研系列
比特币系列
以太坊系列
EOS系列
Filecoin系列
联盟链系列
Fabric系列
智能合约系列
Token系列

Filecoin系列 - 源码分析 - CPU SHA扩展相关推荐

  1. 鸿蒙内核代码 行,鸿蒙内核源码分析(CPU篇) | 内核是如何描述CPU的 ? | 祝新的一年牛气冲天 ! | v36.01...

    本篇说清楚CPU 读本篇之前建议先读鸿蒙内核源码分析(总目录)进程/线程篇.指令是稳定的,但指令序列是变化的,只有这样计算机才能够实现用计算来解决一切问题这个目标.计算是稳定的,但计算的数据是多变的, ...

  2. 鸿蒙内核 cpu兼容,鸿蒙内核源码分析(CPU篇) | 整个内核就是一个死循环 | 祝新的一年牛气冲天 ! | v32.04...

    本篇说清楚CPU 读本篇之前建议先读鸿蒙内核源码分析(总目录)进程/线程篇. 指令是稳定的,但指令序列是变化的,只有这样计算机才能够实现用计算来解决一切问题这个目标.计算是稳定的,但计算的数据是多变的 ...

  3. SequoiaDB 系列源码分析调整

    犹豫我经验尚不够丰富,有大牛跟我说,以我这样定下的结构来分析源码,学习效果不太好. 应该先从程序的进程入口函数开始,慢慢的跟流程来分析.先通过系统的启动.退出来分析所用到的技术,像进程模型,线程模型等 ...

  4. DataX Transformer从入口到加载的源码分析及UDF扩展与使用

    DataX GitHub DataX Transformer 目录 1 前言 2 需求说明 3 解决方案分析 4 解密算法 5 Hive UDF 5.1 测试数据 5.2 新建 Maven 项目 5. ...

  5. DataX Transformer 源码分析及 UDF 扩展与使用

    DataX GitHub DataX Transformer 目录 1 前言 2 需求说明 3 解决方案分析 4 解密算法 5 Hive UDF 5.1 测试数据 5.2 新建 Maven 项目 5. ...

  6. MapGuide源码分析----MapGuide Web扩展源码分析

    本节中,我们将通过介绍如何完成枚举资源功能来介绍MapGuide Web扩展的部分源代码. 在浏览器端的地址栏输入类似如下字符串,就会发送一个枚举资源的HTTP请求. http://hostname/ ...

  7. dubbo源码分析系列——dubbo-cluster模块源码分析

    2019独角兽企业重金招聘Python工程师标准>>> 模块功能介绍 该模块的使用介绍请参考dubbo官方用户手册如下章节内容. 集群容错 负载均衡 路由规则 配置规则 注册中心参考 ...

  8. caffe源码分析-layer

    本文主要分析caffe layer层,主要内容如下: 从整体上说明下caffe的layer层的类别,以及作用 通过proto定义与类Layer简要说明下Layer的核心成员变量; Layer类的核心成 ...

  9. 远哥Amoeba源码分析之:核心类说明

    同事喜欢叫我远哥,所以我把这个笔记称为远哥系列,今天有兴趣分析一下Amoeba的源码,并且在此记录一下,并且随时更新. Amoeba目前一共有三个项目产品,分别是: Amoeba for MySQL: ...

最新文章

  1. dataguard日志传输模式解析_网络运维基础 日志审计
  2. 百度地图——判断用户是否在配送范围内解决方案
  3. 在java中产生随机数_在Java中产生随机数的两个方法
  4. [恢]hdu 2062
  5. 北邮有高考日语学计算机专业的吗,学计算机去北邮好还是去成电好呢?没有最好只有最合适...
  6. csdn插件下载和应用
  7. Linux 操作系统原理 — 操作系统的本质
  8. Jmeter下载与安装
  9. mtk刷机工具sp flash tool_qpst刷机(翻到高中刷机时的记录,想来qpst对现在玩机的人也有用吧...
  10. ArcGIS使用DEM数据划定汇水区具体步骤过程
  11. Matplotlib库介绍
  12. origin 多因子柱状图
  13. lecture9-提高模型泛化能力的方法
  14. ArcGIS 制图搭配:文字、比例尺等大小
  15. 课时31 永久储存:腌制一缸美味的泡菜
  16. [Linux 学习] grub 引导文件
  17. 《Linux内核分析》期中总结
  18. BigDecimal 运算及取小数位
  19. Loadrunner socket测试内容总结
  20. dnf韩服服务器维护中,dnf韩服正式服8月20日更新汇总 修复各职业技能BUG

热门文章

  1. 赵小楼《天道》《遥远的救世主》深度解析(142)贫富差距化是常态,扶贫不是拉平平均值,而是强者去关注弱者
  2. 计算机专业基础综合哪个最难,10个考研最难的专业!你的专业排第几?
  3. hadoop的单机版测试和集群节点的搭建
  4. 两化融合资质认证流程
  5. 没有躲过的坑--string中的c_str()陷阱
  6. sudo: /etc/sudoers.d 可被任何人写
  7. Feburary——1052.爱生气的书店老板
  8. 三分钟学会网络地址相关计算
  9. 【UFUN开发板评测】小巧而不失精致,简单而不失内涵——uFun开发板开箱爆照...
  10. python中remove函数的用法_Remove函数用法