Update BLST, add force-adx support (#1595)

## Issue Addressed

Closes #1504
Closes https://github.com/sigp/lighthouse/issues/1505

## Proposed Changes

* Update `blst` to the latest version, which is more portable and includes finer-grained compilation controls (see below).
* Detect the case where a binary has been explicitly compiled with ADX support but it's missing at runtime, and report a nicer error than `SIGILL`.

## Known Issues

* None. The previous issue with `make build-aarch64` (https://github.com/supranational/blst/issues/27), has been resolved.

## Additional Info

I think we should tweak our release process and our Docker builds so that we provide two options:

Binaries:

* `lighthouse`: compiled with `modern`/`force-adx`, for CPUs 2013 and newer
* `lighthouse-portable`: compiled with `portable` for older CPUs

Docker images:

* `sigp/lighthouse:latest`: multi-arch image with `modern` x86_64 and vanilla aarch64 binary
* `sigp/lighthouse:latest-portable`: multi-arch image with `portable` builds for x86_64 and aarch64

And relevant Docker images for the releases (as per https://github.com/sigp/lighthouse/pull/1574#issuecomment-687766141), tagged `v0.x.y` and `v0.x.y-portable`
This commit is contained in:
Michael Sproul 2020-09-22 05:40:02 +00:00
parent d85d5a435e
commit 4fca306397
5 changed files with 23 additions and 12 deletions

2
Cargo.lock generated
View File

@ -525,7 +525,7 @@ dependencies = [
[[package]] [[package]]
name = "blst" name = "blst"
version = "0.1.1" version = "0.1.1"
source = "git+https://github.com/sigp/blst.git?rev=284f7059642851c760a09fb1708bcb59c7ca323c#284f7059642851c760a09fb1708bcb59c7ca323c" source = "git+https://github.com/supranational/blst.git?rev=a8398ed284b0d78858302ad1ceb25a80e7bbe535#a8398ed284b0d78858302ad1ceb25a80e7bbe535"
dependencies = [ dependencies = [
"cc", "cc",
"glob", "glob",

View File

@ -18,17 +18,15 @@ project.
The `Makefile` in the project contains four targets for cross-compiling: The `Makefile` in the project contains four targets for cross-compiling:
- `build-x86_64`: builds an optimized version for x86_64 processors (suitable - `build-x86_64`: builds an optimized version for x86_64 processors (suitable for most users).
for most users). Supports Intel Broadwell (2014) and newer, and AMD Ryzen (2017) and newer.
- `build-x86_64-portable`: builds a version x86_64 processors which avoids - `build-x86_64-portable`: builds a version for x86_64 processors which avoids using some modern CPU
using some modern CPU instructions that might cause an "illegal instructions that are incompatible with older CPUs. Suitable for pre-Broadwell/Ryzen CPUs.
instruction" error on older CPUs. - `build-aarch64`: builds an optimized version for 64-bit ARM processors
- `build-aarch64`: builds an optimized version for 64bit ARM processors
(suitable for Raspberry Pi 4). (suitable for Raspberry Pi 4).
- `build-aarch64-portable`: builds a version 64 bit ARM processors which avoids - `build-aarch64-portable`: builds a version for 64-bit ARM processors which avoids using some
using some modern CPU instructions that might cause an "illegal modern CPU instructions. In practice, very few ARM processors lack the instructions necessary to
instruction" error on older CPUs. run the faster non-portable build.
### Example ### Example

View File

@ -17,7 +17,7 @@ eth2_hashing = "0.1.0"
ethereum-types = "0.9.1" ethereum-types = "0.9.1"
arbitrary = { version = "0.4.4", features = ["derive"], optional = true } arbitrary = { version = "0.4.4", features = ["derive"], optional = true }
zeroize = { version = "1.0.0", features = ["zeroize_derive"] } zeroize = { version = "1.0.0", features = ["zeroize_derive"] }
blst = { git = "https://github.com/sigp/blst.git", rev = "284f7059642851c760a09fb1708bcb59c7ca323c" } blst = { git = "https://github.com/supranational/blst.git", rev = "a8398ed284b0d78858302ad1ceb25a80e7bbe535" }
[features] [features]
default = ["supranational"] default = ["supranational"]
@ -25,3 +25,4 @@ fake_crypto = []
milagro = [] milagro = []
supranational = [] supranational = []
supranational-portable = ["supranational", "blst/portable"] supranational-portable = ["supranational", "blst/portable"]
supranational-force-adx = ["supranational", "blst/force-adx"]

View File

@ -9,6 +9,9 @@ edition = "2018"
write_ssz_files = ["beacon_node/write_ssz_files"] write_ssz_files = ["beacon_node/write_ssz_files"]
# Compiles the BLS crypto code so that the binary is portable across machines. # Compiles the BLS crypto code so that the binary is portable across machines.
portable = ["bls/supranational-portable"] portable = ["bls/supranational-portable"]
# Compiles BLST so that it always uses ADX instructions.
# Compatible with processors from 2013 onwards.
modern = ["bls/supranational-force-adx"]
# Uses the slower Milagro BLS library, which is written in native Rust. # Uses the slower Milagro BLS library, which is written in native Rust.
milagro = ["bls/milagro"] milagro = ["bls/milagro"]

View File

@ -16,6 +16,8 @@ pub const ETH2_CONFIG_FILENAME: &str = "eth2-spec.toml";
fn bls_library_name() -> &'static str { fn bls_library_name() -> &'static str {
if cfg!(feature = "portable") { if cfg!(feature = "portable") {
"blst-portable" "blst-portable"
} else if cfg!(feature = "modern") {
"blst-modern"
} else if cfg!(feature = "milagro") { } else if cfg!(feature = "milagro") {
"milagro" "milagro"
} else { } else {
@ -181,6 +183,13 @@ fn run<E: EthSpec>(
)); ));
} }
#[cfg(all(feature = "modern", target_arch = "x86_64"))]
if !std::is_x86_feature_detected!("adx") {
return Err(format!(
"CPU incompatible with optimized binary, please try Lighthouse portable build"
));
}
let debug_level = matches let debug_level = matches
.value_of("debug-level") .value_of("debug-level")
.ok_or_else(|| "Expected --debug-level flag".to_string())?; .ok_or_else(|| "Expected --debug-level flag".to_string())?;