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

Add benchmarks comparing to Cairo VM #692

Merged
merged 39 commits into from
Dec 9, 2024
Merged
Changes from 12 commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
a1237aa
Add benches
JulianGCalderon Jun 18, 2024
2ad28d0
Merge branch 'main' into benches_vs_vm
JulianGCalderon Jun 18, 2024
1ef0826
Fix clippy
JulianGCalderon Jun 18, 2024
243d629
Merge branch 'main' into benches_vs_vm
edg-l Jun 21, 2024
702fd8a
Merge branch 'main' into benches_vs_vm
JulianGCalderon Jun 25, 2024
642e6ff
Add more cases
JulianGCalderon Jun 25, 2024
ca6629b
Use fibonacci instead of fib
JulianGCalderon Jun 25, 2024
6ff72dd
Differenciate expect messages
JulianGCalderon Jun 25, 2024
8c726fb
Separate into groups per program
JulianGCalderon Jun 25, 2024
094c7b4
Merge branch 'main' into benches_vs_vm
JulianGCalderon Jun 28, 2024
b88d39b
Merge branch 'main' into benches_vs_vm
pefontana Jul 2, 2024
ae204ba
Merge branch 'main' into benches_vs_vm
pefontana Jul 6, 2024
332ca73
Merge branch 'main' into benches_vs_vm
edg-l Oct 2, 2024
3baaa79
Merge branch 'main' into benches_vs_vm
JulianGCalderon Nov 7, 2024
897838c
Merge branch 'main' into benches_vs_vm
JulianGCalderon Nov 7, 2024
4d379fe
Add result checks
JulianGCalderon Nov 7, 2024
5083718
Merge branch 'benches_vs_vm_2' into benches_vs_vm
JulianGCalderon Nov 7, 2024
6bd8a12
Fix clippy
JulianGCalderon Nov 7, 2024
f21ffda
Merge branch 'main' into benches_vs_vm
JulianGCalderon Nov 7, 2024
dbb6fc7
Add compile bench
JulianGCalderon Nov 7, 2024
ce8e90a
Add linear search
JulianGCalderon Nov 7, 2024
8b30ed3
Add linear search bench
JulianGCalderon Nov 7, 2024
eab4bd6
Lower time
JulianGCalderon Nov 7, 2024
7bf2647
Fix program
JulianGCalderon Nov 8, 2024
1ebd0df
Add linear_search.c
JulianGCalderon Nov 8, 2024
16cfb8e
Merge branch 'main' into benches_vs_vm
JulianGCalderon Nov 11, 2024
356b47a
Add builtin
JulianGCalderon Nov 11, 2024
7ba0be1
Fix
JulianGCalderon Nov 11, 2024
019f74e
Fix symbol number
JulianGCalderon Nov 11, 2024
0680850
Merge branch 'main' into benches_vs_vm
JulianGCalderon Nov 19, 2024
8ab047c
Merge branch 'main' into benches_vs_vm
JulianGCalderon Nov 20, 2024
2a08449
Update benches
JulianGCalderon Nov 20, 2024
5ee1ea5
Merge branch 'main' into benches_vs_vm
JulianGCalderon Nov 25, 2024
a380aa2
Fix bench
JulianGCalderon Nov 25, 2024
2f35f5d
Merge branch 'main' into benches_vs_vm
JulianGCalderon Nov 27, 2024
88d9006
Remove comp benchmark
JulianGCalderon Nov 27, 2024
d66321f
Remove extra dependency
JulianGCalderon Nov 27, 2024
9f05acf
Merge branch 'main' into benches_vs_vm
JulianGCalderon Nov 27, 2024
abdfcbd
Merge branch 'main' into benches_vs_vm
JulianGCalderon Nov 27, 2024
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
140 changes: 121 additions & 19 deletions benches/benches.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
use cairo_lang_compiler::{
compile_prepared_db, db::RootDatabase, project::setup_project, CompilerConfig,
};
use cairo_lang_runner::{SierraCasmRunner, StarknetState};
use cairo_lang_sierra::program::Program;
use cairo_lang_sierra_generator::replace_ids::DebugReplacer;
use cairo_lang_starknet::contract::get_contracts_info;
use cairo_native::{
cache::{AotProgramCache, JitProgramCache},
context::NativeContext,
Expand Down Expand Up @@ -36,25 +39,95 @@ fn criterion_benchmark(c: &mut Criterion) {
let logistic_map_function_id =
find_function_id(&logistic_map, "logistic_map::logistic_map::main");

c.bench_function("Cached JIT factorial_2M", |b| {
b.iter(|| jit_factorial.invoke_dynamic(factorial_function_id, &[], Some(u128::MAX)));
});
c.bench_function("Cached JIT fib_2M", |b| {
b.iter(|| jit_fibonacci.invoke_dynamic(fibonacci_function_id, &[], Some(u128::MAX)));
});
c.bench_function("Cached JIT logistic_map", |b| {
b.iter(|| jit_logistic_map.invoke_dynamic(logistic_map_function_id, &[], Some(u128::MAX)));
});

c.bench_function("Cached AOT factorial_2M", |b| {
b.iter(|| aot_factorial.invoke_dynamic(factorial_function_id, &[], Some(u128::MAX)));
});
c.bench_function("Cached AOT fib_2M", |b| {
b.iter(|| aot_fibonacci.invoke_dynamic(fibonacci_function_id, &[], Some(u128::MAX)));
});
c.bench_function("Cached AOT logistic_map", |b| {
b.iter(|| aot_logistic_map.invoke_dynamic(logistic_map_function_id, &[], Some(u128::MAX)));
});
let factorial_runner = load_contract_for_vm("programs/benches/factorial_2M.cairo");
let fibonacci_runner = load_contract_for_vm("programs/benches/fib_2M.cairo");
let logistic_map_runner = load_contract_for_vm("programs/benches/logistic_map.cairo");

let factorial_function = factorial_runner
.find_function("main")
.expect("failed to find main factorial function");
let fibonacci_function = fibonacci_runner
.find_function("main")
.expect("failed to find main fibonacci function");
let logistic_map_function = logistic_map_runner
.find_function("main")
.expect("failed to find main logistic map function");

{
let mut factorial_group = c.benchmark_group("factorial_2M");

factorial_group.bench_function("Cached JIT", |b| {
b.iter(|| jit_factorial.invoke_dynamic(factorial_function_id, &[], Some(u128::MAX)));
});
factorial_group.bench_function("Cached AOT", |b| {
b.iter(|| aot_factorial.invoke_dynamic(factorial_function_id, &[], Some(u128::MAX)));
});

factorial_group.bench_function("VM", |b| {
b.iter(|| {
factorial_runner.run_function_with_starknet_context(
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We need to find another way to execute the VM.
See the fn run_function_with_starknet_context

        let assembled_program = self.casm_program.clone().assemble_ex(&entry_code, &footer);

It clone the casm_program adding lot of overhead to the execution

We need to discuss how we do this, maybe we have to add a new method to the cairo-vm/cairo1-run crate

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that particular issue has been fixed: https://github.com/starkware-libs/cairo/blob/226c3646be247828c08b737a73f6da10de76e0fc/crates/cairo-lang-runner/src/lib.rs#L191

let assembled_cairo_program = self.casm_program.assemble_ex(&header, &footer);

factorial_function,
&[],
Some(usize::MAX),
StarknetState::default(),
)
});
});

factorial_group.finish();
}

{
let mut fibonacci_group = c.benchmark_group("fibonacci_2M");

fibonacci_group.bench_function("Cached JIT", |b| {
b.iter(|| jit_fibonacci.invoke_dynamic(fibonacci_function_id, &[], Some(u128::MAX)));
});
fibonacci_group.bench_function("Cached AOT", |b| {
b.iter(|| aot_fibonacci.invoke_dynamic(fibonacci_function_id, &[], Some(u128::MAX)));
});
fibonacci_group.bench_function("VM", |b| {
b.iter(|| {
fibonacci_runner.run_function_with_starknet_context(
fibonacci_function,
&[],
Some(usize::MAX),
StarknetState::default(),
)
});
});

fibonacci_group.finish();
}

{
let mut logistic_map_group = c.benchmark_group("logistic_map");

logistic_map_group.bench_function("Cached JIT", |b| {
b.iter(|| {
jit_logistic_map.invoke_dynamic(logistic_map_function_id, &[], Some(u128::MAX))
});
});

logistic_map_group.bench_function("Cached AOT", |b| {
b.iter(|| {
aot_logistic_map.invoke_dynamic(logistic_map_function_id, &[], Some(u128::MAX))
});
});

logistic_map_group.bench_function("VM", |b| {
b.iter(|| {
logistic_map_runner.run_function_with_starknet_context(
logistic_map_function,
&[],
Some(usize::MAX),
StarknetState::default(),
)
});
});

logistic_map_group.finish();
}

#[cfg(target_arch = "x86_64")]
{
Expand Down Expand Up @@ -145,5 +218,34 @@ fn load_contract(path: impl AsRef<Path>) -> Program {
.unwrap()
}

fn load_contract_for_vm(path: impl AsRef<Path>) -> SierraCasmRunner {
let mut db = RootDatabase::builder()
.detect_corelib()
.build()
.expect("failed to build database");
let main_crate_ids = setup_project(&mut db, path.as_ref()).expect("failed to setup project");
let program = compile_prepared_db(
&mut db,
main_crate_ids.clone(),
CompilerConfig {
replace_ids: true,
..Default::default()
},
)
.expect("failed to compile program");

let replacer = DebugReplacer { db: &db };
let contracts_info =
get_contracts_info(&db, main_crate_ids, &replacer).expect("failed to get contracts info");

SierraCasmRunner::new(
program.clone(),
Some(Default::default()),
contracts_info,
None,
)
.expect("failed to create runner")
}

criterion_group!(benches, criterion_benchmark);
criterion_main!(benches);
Loading