Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

perf: re-order gas check #15

Merged
merged 1 commit into from
Apr 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 59 additions & 0 deletions .github/workflows/bench.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
name: Benchmark

on:
push:
branches: [main]
pull_request:
branches: [main]
workflow_dispatch:

env:
CARGO_TERM_COLOR: always
LLVM_VERSION: "17" # Must be just the major version

concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true

jobs:
iai:
runs-on: ubuntu-latest
env:
BASELINE: base
IAI_CALLGRIND_RUNNER: iai-callgrind-runner
steps:
- uses: actions/checkout@v4
- name: Install LLVM
run: sudo .github/scripts/install_llvm_ubuntu.sh ${{ env.LLVM_VERSION }}
- name: Install Valgrind
run: sudo apt update && sudo apt install valgrind
- uses: dtolnay/rust-toolchain@stable
- name: Install cargo-binstall
uses: taiki-e/install-action@cargo-binstall
- name: Install iai-callgrind-runner
run: |
echo "::group::Install"
version=$(cargo metadata --format-version=1 |\
jq '.packages[] | select(.name == "iai-callgrind").version' |\
tr -d '"'
)
cargo binstall iai-callgrind-runner --version $version --no-confirm --no-symlinks --force
echo "::endgroup::"
echo "::group::Verification"
which iai-callgrind-runner
echo "::endgroup::"
- name: Checkout base
uses: actions/checkout@v4
with:
ref: ${{ github.base_ref || 'main' }}
- uses: Swatinem/rust-cache@v2
with:
cache-on-failure: true
- name: Save baseline
run: cargo bench -p revm-jit-cli --bench iai -- --save-baseline=$BASELINE
- name: Checkout PR
uses: actions/checkout@v4
with:
clean: false
- name: Compare PR benchmarks
run: cargo bench -p revm-jit-cli --bench iai -- --baseline=$BASELINE
43 changes: 1 addition & 42 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ on:
push:
branches: [main]
pull_request:
branches: [main]

env:
CARGO_TERM_COLOR: always
Expand Down Expand Up @@ -53,48 +54,6 @@ jobs:
- name: test
run: cargo test --all-features --workspace --profile ${{ matrix.profile }}

iai:
runs-on: ubuntu-latest
env:
BASELINE: base
IAI_CALLGRIND_RUNNER: iai-callgrind-runner
steps:
- uses: actions/checkout@v4
- name: Install LLVM
run: sudo .github/scripts/install_llvm_ubuntu.sh ${{ env.LLVM_VERSION }}
- name: Install Valgrind
run: sudo apt update && sudo apt install valgrind
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
with:
cache-on-failure: true
- name: Install cargo-binstall
uses: taiki-e/install-action@cargo-binstall
- name: Install iai-callgrind-runner
run: |
echo "::group::Install"
version=$(cargo metadata --format-version=1 |\
jq '.packages[] | select(.name == "iai-callgrind").version' |\
tr -d '"'
)
cargo binstall iai-callgrind-runner --version $version --no-confirm --no-symlinks --force
echo "::endgroup::"
echo "::group::Verification"
which iai-callgrind-runner
echo "::endgroup::"
- name: Checkout base
uses: actions/checkout@v4
with:
ref: ${{ github.base_ref || 'main' }}
- name: Save baseline
run: cargo bench -p revm-jit-cli --bench iai -- --save-baseline=$BASELINE
- name: Checkout PR
uses: actions/checkout@v4
with:
clean: false
- name: Compare PR benchmarks
run: cargo bench -p revm-jit-cli --bench iai -- --baseline=$BASELINE

feature-checks:
runs-on: ubuntu-latest
timeout-minutes: 30
Expand Down
26 changes: 20 additions & 6 deletions crates/revm-jit-cli/benches/iai.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,17 @@ binary_benchmark_group!(
);

fn setup_group(group: &mut BinaryBenchmarkGroup, is_ct: bool) {
let make_run = |name: &str| {
let make_run = |name: &str, small: bool| {
let mut args = Vec::with_capacity(3);
args.push(name);
// let out_dir = std::env::temp_dir().join("revm-jit-cli-iai");
// let so = out_dir.join(name).join("a.so");
if is_ct {
args.extend(["--aot", "--no-link"]);
// args.extend(["--aot", "--no-link", "-o", out_dir.to_str().unwrap()]);
} else {
args.push("1");
// args.extend(["1", "--shared-library", so.to_str().unwrap()]);
}
let arg = Arg::new(name, args);
let mut run = Run::with_cmd(CMD, arg);
Expand All @@ -35,22 +39,32 @@ fn setup_group(group: &mut BinaryBenchmarkGroup, is_ct: bool) {

let mut regression = RegressionConfig::default();
if is_ct {
regression.limits([(EventKind::EstimatedCycles, 10.0)]);
let cycles = if small { 50.0 } else { 20.0 };
regression.limits([(EventKind::EstimatedCycles, cycles)]);
} else {
regression.limits([(EventKind::EstimatedCycles, 5.0)]);
}
run.regression(regression);

if !is_ci() {
if small && !is_ci() {
let flamegraph = FlamegraphConfig::default();
run.flamegraph(flamegraph);
}

run
};
let benches = ["fibonacci", "counter", "push0_proxy", "weth", "hash_20k", "usdc_proxy"];
for bench in &benches {
group.bench(make_run(bench));
let benches = [
("fibonacci", true),
("counter", true),
("hash_20k", true),
("usdc_proxy", false),
("weth", false),
];
for (bench, small) in benches {
if !is_ct && !small {
continue;
}
group.bench(make_run(bench, small));
}
}

Expand Down
7 changes: 4 additions & 3 deletions crates/revm-jit/src/compiler/translate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1324,16 +1324,17 @@ impl<'a, B: Backend> FunctionCx<'a, B> {
return;
}

// `Gas::record_cost`
// Modified from `Gas::record_cost`.
let gas_remaining = self.load_gas_remaining();
let (res, overflow) = self.bcx.usub_overflow(gas_remaining, cost);
self.build_check(overflow, InstructionResult::OutOfGas);

let nomem = self.gas_remaining_nomem.load(&mut self.bcx, "gas_remaining_nomem");
let nomem = self.bcx.isub(nomem, cost);
self.gas_remaining_nomem.store(&mut self.bcx, nomem);

self.store_gas_remaining(res);
self.gas_remaining_nomem.store(&mut self.bcx, nomem);

self.build_check(overflow, InstructionResult::OutOfGas);
}

/*
Expand Down