Skip to content

Commit

Permalink
dev: update vm initialization benchmark (#1505)
Browse files Browse the repository at this point in the history
Updates #1502 to use dependent
gas price for `vm_initialization`.

This PR:
- Adapts the `vm_initialization` gas cost to a dependent cost
- Modifies the VM initialization benchmark to use a variable size
transaction
- Updates `fuel-vm` to the newly created `v0.42.2`

This adds the following benchmarks to the suite:

```
vm_initialization/vm_initialization_with_tx_size_2191080                                                                            
                        time:   [385.44 µs 387.54 µs 389.67 µs]
                        thrpt:  [5.2368 GiB/s 5.2655 GiB/s 5.2942 GiB/s]
vm_initialization/vm_initialization_with_tx_size_2322152                                                                            
                        time:   [407.82 µs 409.68 µs 411.57 µs]
                        thrpt:  [5.2547 GiB/s 5.2790 GiB/s 5.3030 GiB/s]
vm_initialization/vm_initialization_with_tx_size_2453224                                                                            
                        time:   [424.74 µs 426.49 µs 428.23 µs]
                        thrpt:  [5.3354 GiB/s 5.3570 GiB/s 5.3791 GiB/s]
vm_initialization/vm_initialization_with_tx_size_2584296                                                                            
                        time:   [445.98 µs 450.28 µs 456.29 µs]
                        thrpt:  [5.2748 GiB/s 5.3452 GiB/s 5.3966 GiB/s]
vm_initialization/vm_initialization_with_tx_size_2715368                                                                            
                        time:   [468.75 µs 473.45 µs 479.25 µs]
                        thrpt:  [5.2767 GiB/s 5.3414 GiB/s 5.3949 GiB/s]
vm_initialization/vm_initialization_with_tx_size_2846440                                                                            
                        time:   [490.47 µs 494.15 µs 498.82 µs]
                        thrpt:  [5.3145 GiB/s 5.3647 GiB/s 5.4049 GiB/s]
vm_initialization/vm_initialization_with_tx_size_2977512                                                                            
                        time:   [505.35 µs 509.33 µs 513.98 µs]
                        thrpt:  [5.3952 GiB/s 5.4445 GiB/s 5.4873 GiB/s]
vm_initialization/vm_initialization_with_tx_size_3108584                                                                            
                        time:   [526.05 µs 529.11 µs 532.63 µs]
                        thrpt:  [5.4355 GiB/s 5.4717 GiB/s 5.5035 GiB/s]
vm_initialization/vm_initialization_with_tx_size_3239656                                                                            
                        time:   [547.18 µs 550.45 µs 553.83 µs]
                        thrpt:  [5.4478 GiB/s 5.4813 GiB/s 5.5140 GiB/s]
vm_initialization/vm_initialization_with_tx_size_3370728                                                                            
                        time:   [565.98 µs 568.75 µs 571.58 µs]
                        thrpt:  [5.4923 GiB/s 5.5195 GiB/s 5.5465 GiB/s]
vm_initialization/vm_initialization_with_tx_size_3501800                                                                            
                        time:   [585.76 µs 588.62 µs 591.47 µs]
                        thrpt:  [5.5139 GiB/s 5.5406 GiB/s 5.5677 GiB/s]
vm_initialization/vm_initialization_with_tx_size_3632872                                                                            
                        time:   [607.51 µs 610.83 µs 614.26 µs]
                        thrpt:  [5.5080 GiB/s 5.5390 GiB/s 5.5693 GiB/s]
vm_initialization/vm_initialization_with_tx_size_3763944                                                                            
                        time:   [630.00 µs 635.47 µs 642.49 µs]
                        thrpt:  [5.4560 GiB/s 5.5163 GiB/s 5.5642 GiB/s]
vm_initialization/vm_initialization_with_tx_size_3895016                                                                            
                        time:   [652.06 µs 656.04 µs 660.74 µs]
                        thrpt:  [5.4901 GiB/s 5.5294 GiB/s 5.5632 GiB/s]
vm_initialization/vm_initialization_with_tx_size_4026088                                                                            
                        time:   [664.38 µs 667.29 µs 670.21 µs]
                        thrpt:  [5.5946 GiB/s 5.6191 GiB/s 5.6438 GiB/s]
vm_initialization/vm_initialization_with_tx_size_4157160                                                                            
                        time:   [712.86 µs 718.35 µs 724.60 µs]
                        thrpt:  [5.3431 GiB/s 5.3896 GiB/s 5.4311 GiB/s]
```

Locally, this produces the following dependent cost for VM
initialization:

```
        vm_initialization: DependentCost::LightOperation {
             base: 55476,
             units_per_gas: 39,
         },
```

---------

Co-authored-by: xgreenx <xgreenx9999@gmail.com>
  • Loading branch information
Brandon Vrooman and xgreenx authored Nov 22, 2023
1 parent bbdb283 commit 7956f19
Show file tree
Hide file tree
Showing 20 changed files with 149 additions and 72 deletions.
32 changes: 16 additions & 16 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ fuel-core-tests = { version = "0.0.0", path = "./tests" }
fuel-core-xtask = { version = "0.0.0", path = "./xtask" }

# Fuel dependencies
fuel-vm-private = { version = "0.42.1", package = "fuel-vm", default-features = false }
fuel-vm-private = { version = "0.43.0", package = "fuel-vm", default-features = false }

# Common dependencies
anyhow = "1.0"
Expand Down
5 changes: 4 additions & 1 deletion benches/benches/block_target_gas_set/default_gas_costs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,10 @@ pub fn default_gas_costs() -> GasCostsValues {
lw: 2,
mint: 25515,
mlog: 2,
vm_initialization: 1,
vm_initialization: DependentCost::HeavyOperation {
base: 2000,
gas_per_unit: 0,
},
modi: 2,
mod_op: 2,
movi: 2,
Expand Down
85 changes: 47 additions & 38 deletions benches/benches/vm_initialization.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use criterion::{
black_box,
Criterion,
Throughput,
};
use fuel_core_types::{
fuel_asm::{
Expand All @@ -17,8 +18,12 @@ use fuel_core_types::{
Transaction,
Word,
},
fuel_types::canonical::Serialize,
fuel_vm::{
checked_transaction::IntoChecked,
checked_transaction::{
Checked,
IntoChecked,
},
interpreter::NotSupportedEcal,
Interpreter,
},
Expand All @@ -29,11 +34,13 @@ use rand::{
SeedableRng,
};

pub fn vm_initialization(c: &mut Criterion) {
let rng = &mut StdRng::seed_from_u64(8586);
fn transaction<R: Rng>(
rng: &mut R,
script: Vec<u8>,
script_data: Vec<u8>,
) -> Checked<Script> {
let consensus_params = ConsensusParameters::default();

let inputs = (0..consensus_params.tx_params.max_inputs)
let inputs = (0..1)
.map(|_| {
Input::coin_predicate(
rng.gen(),
Expand All @@ -43,59 +50,61 @@ pub fn vm_initialization(c: &mut Criterion) {
rng.gen(),
rng.gen(),
0,
vec![
255;
(consensus_params.predicate_params.max_predicate_length
/ consensus_params.tx_params.max_inputs as u64)
as usize
],
vec![
255;
(consensus_params.predicate_params.max_predicate_data_length
/ consensus_params.tx_params.max_inputs as u64)
as usize
],
vec![255; 1],
vec![255; 1],
)
})
.collect();

let outputs = (0..consensus_params.tx_params.max_outputs)
let outputs = (0..1)
.map(|_| {
Output::variable(Default::default(), Default::default(), Default::default())
})
.collect();

let tx = Transaction::script(
1000000,
vec![
op::ret(1);
consensus_params.script_params.max_script_length as usize / Instruction::SIZE
]
.into_iter()
.collect(),
vec![255; consensus_params.script_params.max_script_data_length as usize],
Transaction::script(
1_000_000,
script,
script_data,
Policies::new()
.with_gas_price(0)
.with_maturity(0.into())
.with_max_fee(Word::MAX),
inputs,
outputs,
vec![vec![123; 100].into(); consensus_params.tx_params.max_witnesses as usize],
vec![vec![123; 32].into(); 1],
)
.into_checked_basic(Default::default(), &consensus_params)
.expect("Should produce a valid transaction");
.expect("Should produce a valid transaction")
}

pub fn vm_initialization(c: &mut Criterion) {
let mut rng = StdRng::seed_from_u64(8586);

let mut group = c.benchmark_group("vm_initialization");

group.bench_function("vm_initialization", |b| {
b.iter(|| {
let mut vm = black_box(
Interpreter::<_, Script, NotSupportedEcal>::with_memory_storage(),
);
black_box(vm.init_script(tx.clone()))
.expect("Should be able to execute transaction");
})
});
// Generate N data points
const N: usize = 18;
for i in 5..N {
let size = 8 * 1 << i;
let script = vec![op::ret(1); size / Instruction::SIZE]
.into_iter()
.collect();
let script_data = vec![255; size];
let tx = transaction(&mut rng, script, script_data);
let tx_size = tx.transaction().size();
let name = format!("vm_initialization_with_tx_size_{}", tx_size);
group.throughput(Throughput::Bytes(tx_size as u64));
group.bench_function(name, |b| {
b.iter(|| {
let mut vm = black_box(
Interpreter::<_, Script, NotSupportedEcal>::with_memory_storage(),
);
black_box(vm.init_script(tx.clone()))
.expect("Should be able to execute transaction");
})
});
}

group.finish();
}
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,12 @@ expression: json
}
},
"new_storage_per_byte": 1,
"vm_initialization": 2000
"vm_initialization": {
"HeavyOperation": {
"base": 2000,
"gas_per_unit": 0
}
}
},
"base_asset_id": "0000000000000000000000000000000000000000000000000000000000000000"
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,12 @@ expression: json
}
},
"new_storage_per_byte": 1,
"vm_initialization": 2000
"vm_initialization": {
"HeavyOperation": {
"base": 2000,
"gas_per_unit": 0
}
}
},
"base_asset_id": "0000000000000000000000000000000000000000000000000000000000000000"
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,12 @@ expression: json
}
},
"new_storage_per_byte": 1,
"vm_initialization": 2000
"vm_initialization": {
"HeavyOperation": {
"base": 2000,
"gas_per_unit": 0
}
}
},
"base_asset_id": "0000000000000000000000000000000000000000000000000000000000000000"
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,12 @@ expression: json
}
},
"new_storage_per_byte": 1,
"vm_initialization": 2000
"vm_initialization": {
"HeavyOperation": {
"base": 2000,
"gas_per_unit": 0
}
}
},
"base_asset_id": "0000000000000000000000000000000000000000000000000000000000000000"
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,12 @@ expression: json
}
},
"new_storage_per_byte": 1,
"vm_initialization": 2000
"vm_initialization": {
"HeavyOperation": {
"base": 2000,
"gas_per_unit": 0
}
}
},
"base_asset_id": "0000000000000000000000000000000000000000000000000000000000000000"
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,12 @@ expression: json
}
},
"new_storage_per_byte": 1,
"vm_initialization": 2000
"vm_initialization": {
"HeavyOperation": {
"base": 2000,
"gas_per_unit": 0
}
}
},
"base_asset_id": "0000000000000000000000000000000000000000000000000000000000000000"
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,12 @@ expression: json
}
},
"new_storage_per_byte": 1,
"vm_initialization": 2000
"vm_initialization": {
"HeavyOperation": {
"base": 2000,
"gas_per_unit": 0
}
}
},
"base_asset_id": "0000000000000000000000000000000000000000000000000000000000000000"
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,12 @@ expression: json
}
},
"new_storage_per_byte": 1,
"vm_initialization": 2000
"vm_initialization": {
"HeavyOperation": {
"base": 2000,
"gas_per_unit": 0
}
}
},
"base_asset_id": "0000000000000000000000000000000000000000000000000000000000000000"
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,12 @@ expression: json
}
},
"new_storage_per_byte": 1,
"vm_initialization": 2000
"vm_initialization": {
"HeavyOperation": {
"base": 2000,
"gas_per_unit": 0
}
}
},
"base_asset_id": "0000000000000000000000000000000000000000000000000000000000000000"
},
Expand Down
2 changes: 1 addition & 1 deletion crates/client/assets/schema.sdl
Original file line number Diff line number Diff line change
Expand Up @@ -386,7 +386,7 @@ type GasCosts {
swwq: DependentCost!
contractRoot: DependentCost!
stateRoot: DependentCost!
vmInitialization: U64!
vmInitialization: DependentCost!
newStoragePerByte: U64!
}

Expand Down
2 changes: 1 addition & 1 deletion crates/client/src/client/schema/chain.rs
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,7 @@ include_from_impls_and_cynic! {
// Non-opcodes prices
pub contract_root: DependentCost,
pub state_root: DependentCost,
pub vm_initialization: U64,
pub vm_initialization: DependentCost,
pub new_storage_per_byte: U64,
}
}
Expand Down
Loading

0 comments on commit 7956f19

Please sign in to comment.