mirror of
https://github.com/sigp/lighthouse.git
synced 2026-04-18 05:18:30 +00:00
Use hardware acceleration for SHA256 (#2426)
## Proposed Changes Modify the SHA256 implementation in `eth2_hashing` so that it switches between `ring` and `sha2` to take advantage of [x86_64 SHA extensions](https://en.wikipedia.org/wiki/Intel_SHA_extensions). The extensions are available on modern Intel and AMD CPUs, and seem to provide a considerable speed-up: on my Ryzen 5950X it dropped state tree hashing times by about 30% from 35ms to 25ms (on Prater). ## Additional Info The extensions became available in the `sha2` crate [last year](https://www.reddit.com/r/rust/comments/hf2vcx/ann_rustcryptos_sha1_and_sha2_now_support/), and are not available in Ring, which uses a [pure Rust implementation of sha2](https://github.com/briansmith/ring/blob/main/src/digest/sha2.rs). Ring is faster on CPUs that lack the extensions so I've implemented a runtime switch to use `sha2` only when the extensions are available. The runtime switching seems to impose a miniscule penalty (see the benchmarks linked below).
This commit is contained in:
@@ -7,6 +7,7 @@ use clap::{App, Arg, ArgMatches};
|
||||
use clap_utils::flags::DISABLE_MALLOC_TUNING_FLAG;
|
||||
use env_logger::{Builder, Env};
|
||||
use environment::EnvironmentBuilder;
|
||||
use eth2_hashing::have_sha_extensions;
|
||||
use eth2_network_config::{Eth2NetworkConfig, DEFAULT_HARDCODED_NETWORK};
|
||||
use lighthouse_version::VERSION;
|
||||
use malloc_utils::configure_memory_allocator;
|
||||
@@ -43,10 +44,13 @@ fn main() {
|
||||
.long_version(
|
||||
format!(
|
||||
"{}\n\
|
||||
BLS Library: {}\n\
|
||||
Specs: mainnet (true), minimal ({}), v0.12.3 ({})",
|
||||
VERSION.replace("Lighthouse/", ""), bls_library_name(),
|
||||
cfg!(feature = "spec-minimal"), cfg!(feature = "spec-v12"),
|
||||
BLS library: {}\n\
|
||||
SHA256 hardware acceleration: {}\n\
|
||||
Specs: mainnet (true), minimal ({})",
|
||||
VERSION.replace("Lighthouse/", ""),
|
||||
bls_library_name(),
|
||||
have_sha_extensions(),
|
||||
cfg!(feature = "spec-minimal"),
|
||||
).as_str()
|
||||
)
|
||||
.arg(
|
||||
@@ -205,7 +209,7 @@ fn main() {
|
||||
EthSpecId::Mainnet => run(EnvironmentBuilder::mainnet(), &matches, testnet_config),
|
||||
#[cfg(feature = "spec-minimal")]
|
||||
EthSpecId::Minimal => run(EnvironmentBuilder::minimal(), &matches, testnet_config),
|
||||
#[cfg(any(not(feature = "spec-minimal")))]
|
||||
#[cfg(not(feature = "spec-minimal"))]
|
||||
other => {
|
||||
eprintln!(
|
||||
"Eth spec `{}` is not supported by this build of Lighthouse",
|
||||
|
||||
Reference in New Issue
Block a user