## Proposed Changes Add a new Cargo compilation profile called `maxperf` which enables more aggressive compiler optimisations at the expense of compilation time. Some rough initial benchmarks show that this can provide up to a 25% reduction to run time for CPU bound tasks like block processing: https://docs.google.com/spreadsheets/d/15jHuZe7lLHhZq9Nw8kc6EL0Qh_N_YAYqkW2NQ_Afmtk/edit The numbers in that spreadsheet compare the `consensus-context` branch from #3604 to the same branch compiled with the `maxperf` profile using: ``` PROFILE=maxperf make install-lcli ``` ## Additional Info The downsides of the maxperf profile are: - It increases compile times substantially, which will particularly impact low-spec hardware. Compiling `lcli` is about 3x slower. Compiling Lighthouse is about 5x slower on my 5950X: 17m 38s rather than 3m 28s. As a result I think we should not enable this everywhere by default. - **Option 1**: enable by default for our released binaries. This gives the majority of users the fastest version of `lighthouse` possible, at the expense of slowing down our release CI. Source builds will continue to use the default `release` profile unless users opt-in to `maxperf`. - **Option 2**: enable by default for source builds. This gives users building from source an edge, but makes them pay for it with compilation time. I think I would prefer Option 1. I'll try doing some benchmarking to see how long a maxperf build of Lighthouse would take on GitHub actions. Credit to Nicholas Nethercote for documenting these options in the Rust Performance Book: https://nnethercote.github.io/perf-book/build-configuration.html.
1.9 KiB
Cross-compiling
Lighthouse supports cross-compiling, allowing users to run a binary on one
platform (e.g., aarch64) that was compiled on another platform (e.g.,
x86_64).
Instructions
Cross-compiling requires Docker,
rustembedded/cross and for the
current user to be in the docker group.
The binaries will be created in the target/ directory of the Lighthouse
project.
Targets
The Makefile in the project contains four targets for cross-compiling:
build-x86_64: builds an optimized version for x86_64 processors (suitable for most users).build-x86_64-portable: builds a version for x86_64 processors which avoids using some modern CPU instructions that are incompatible with older CPUs.build-aarch64: builds an optimized version for 64-bit ARM processors (suitable for Raspberry Pi 4).build-aarch64-portable: builds a version for 64-bit ARM processors which avoids using some modern CPU instructions. In practice, very few ARM processors lack the instructions necessary to run the faster non-portable build.
For more information about optimized vs portable builds see Portability.
Example
cd lighthouse
make build-aarch64
The lighthouse binary will be compiled inside a Docker container and placed
in lighthouse/target/aarch64-unknown-linux-gnu/release.
Feature Flags
When using the makefile the set of features used for building can be controlled with
the environment variable CROSS_FEATURES. See Feature
Flags for available features.
Compilation Profiles
When using the makefile the build profile can be controlled with the environment variable
CROSS_PROFILE. See Compilation Profiles for
available profiles.