diff --git a/wecare/Cargo.toml b/wecare/Cargo.toml index 5b5ec65..0f8079f 100644 --- a/wecare/Cargo.toml +++ b/wecare/Cargo.toml @@ -28,3 +28,17 @@ harness = false [[bench]] name = "shamir-25519" harness = false + +[[bench]] +name = "feldman-25519" +harness = false + +[[bench]] +name = "spdz-32" +harness = false + +[[bench]] +name = "shamir-32" +harness = false + + diff --git a/wecare/benches/feldman-25519.rs b/wecare/benches/feldman-25519.rs new file mode 100644 index 0000000..d87bf6c --- /dev/null +++ b/wecare/benches/feldman-25519.rs @@ -0,0 +1,114 @@ +use criterion::{criterion_group, criterion_main, Criterion}; +use std::{hint::black_box, thread}; +use std::{io::Write, time::Duration}; +use wecare::vm::{blocking, FieldKind}; +use wecare::{vm::Engine, vm::SchemeKind}; + +fn build_feldman_engines() -> (blocking::Engine, blocking::Engine) { + let clock = std::time::Instant::now(); + print!("Setting up engines..."); + let _ = std::io::stdout().flush(); + let (e1, e2) = thread::scope(|scope| { + let e2 = scope.spawn(|| { + Engine::builder() + .address("127.0.0.1:1234") + .participant("127.0.0.1:1235") + .scheme(SchemeKind::Feldman) + .field(FieldKind::Curve25519) + .single_threaded_runtime() + .connect_blocking() + .unwrap() + .build() + .unwrap() + }); + let e1 = scope.spawn(|| { + thread::sleep(Duration::from_millis(200)); + Engine::builder() + .address("127.0.0.1:1235") + .participant("127.0.0.1:1234") + .scheme(SchemeKind::Feldman) + .field(FieldKind::Curve25519) + .single_threaded_runtime() + .connect_blocking() + .unwrap() + .build() + .unwrap() + }); + (e1.join().unwrap(), e2.join().unwrap()) + }); + println!(" Complete! (took {:#?})", clock.elapsed()); + (e1, e2) +} + +fn criterion_benchmark(c: &mut Criterion) { + let (mut e1, mut e2) = build_feldman_engines(); + c.bench_function("feldman-25519 single", |b| { + let input1 = vec![7.0]; + let input2 = vec![3.0]; + b.iter(|| { + thread::scope(|scope| { + let t1 = scope.spawn(|| { + black_box(e1.sum(&input1)); + }); + let t2 = scope.spawn(|| { + black_box(e2.sum(&input2)); + }); + t1.join().unwrap(); + t2.join().unwrap(); + }); + }); + }); + c.bench_function("feldman-25519 vec32", |b| { + let input1 = vec![7.0; 32]; + let input2 = vec![3.0; 32]; + b.iter(|| { + thread::scope(|scope| { + let t1 = scope.spawn(|| { + black_box(e1.sum(&input1)); + }); + let t2 = scope.spawn(|| { + black_box(e2.sum(&input2)); + }); + t1.join().unwrap(); + t2.join().unwrap(); + }); + }); + }); + c.bench_function("feldman-25519 vec64", |b| { + let input1 = vec![7.0; 64]; + let input2 = vec![3.0; 64]; + b.iter(|| { + thread::scope(|scope| { + let t1 = scope.spawn(|| { + black_box(e1.sum(&input1)); + }); + let t2 = scope.spawn(|| { + black_box(e2.sum(&input2)); + }); + t1.join().unwrap(); + t2.join().unwrap(); + }); + }); + }); + c.bench_function("feldman-25519 vec128", |b| { + let input1 = vec![7.0; 128]; + let input2 = vec![3.0; 128]; + b.iter(|| { + thread::scope(|scope| { + let t1 = scope.spawn(|| { + black_box(e1.sum(&input1)); + }); + let t2 = scope.spawn(|| { + black_box(e2.sum(&input2)); + }); + t1.join().unwrap(); + t2.join().unwrap(); + }); + }); + }); + let _ = e1.shutdown(); + let _ = e2.shutdown(); +} + +criterion_group!(benches, criterion_benchmark); +criterion_main!(benches); diff --git a/wecare/benches/shamir-25519.rs b/wecare/benches/shamir-25519.rs index 19c6765..d4fc2ef 100644 --- a/wecare/benches/shamir-25519.rs +++ b/wecare/benches/shamir-25519.rs @@ -42,7 +42,7 @@ fn build_shamir_engines() -> (blocking::Engine, blocking::Engine) { fn criterion_benchmark(c: &mut Criterion) { let (mut e1, mut e2) = build_shamir_engines(); - c.bench_function("shamir single", |b| { + c.bench_function("shamir-25519 single", |b| { let input1 = vec![7.0]; let input2 = vec![3.0]; b.iter(|| { @@ -58,7 +58,7 @@ fn criterion_benchmark(c: &mut Criterion) { }); }); }); - c.bench_function("shamir vec32", |b| { + c.bench_function("shamir-25519 vec32", |b| { let input1 = vec![7.0; 32]; let input2 = vec![3.0; 32]; b.iter(|| { @@ -74,7 +74,7 @@ fn criterion_benchmark(c: &mut Criterion) { }); }); }); - c.bench_function("shamir vec64", |b| { + c.bench_function("shamir-25519 vec64", |b| { let input1 = vec![7.0; 64]; let input2 = vec![3.0; 64]; b.iter(|| { @@ -90,7 +90,7 @@ fn criterion_benchmark(c: &mut Criterion) { }); }); }); - c.bench_function("shamir vec128", |b| { + c.bench_function("shamir-25519 vec128", |b| { let input1 = vec![7.0; 128]; let input2 = vec![3.0; 128]; b.iter(|| { diff --git a/wecare/benches/shamir-32.rs b/wecare/benches/shamir-32.rs new file mode 100644 index 0000000..78b7c1d --- /dev/null +++ b/wecare/benches/shamir-32.rs @@ -0,0 +1,114 @@ +use criterion::{criterion_group, criterion_main, Criterion}; +use std::{hint::black_box, thread}; +use std::{io::Write, time::Duration}; +use wecare::vm::{blocking, FieldKind}; +use wecare::{vm::Engine, vm::SchemeKind}; + +fn build_shamir_engines() -> (blocking::Engine, blocking::Engine) { + let clock = std::time::Instant::now(); + print!("Setting up engines..."); + let _ = std::io::stdout().flush(); + let (e1, e2) = thread::scope(|scope| { + let e2 = scope.spawn(|| { + Engine::builder() + .address("127.0.0.1:1234") + .participant("127.0.0.1:1235") + .scheme(SchemeKind::Shamir) + .field(FieldKind::Element32) + .single_threaded_runtime() + .connect_blocking() + .unwrap() + .build() + .unwrap() + }); + let e1 = scope.spawn(|| { + thread::sleep(Duration::from_millis(200)); + Engine::builder() + .address("127.0.0.1:1235") + .participant("127.0.0.1:1234") + .scheme(SchemeKind::Shamir) + .field(FieldKind::Element32) + .single_threaded_runtime() + .connect_blocking() + .unwrap() + .build() + .unwrap() + }); + (e1.join().unwrap(), e2.join().unwrap()) + }); + println!(" Complete! (took {:#?})", clock.elapsed()); + (e1, e2) +} + +fn criterion_benchmark(c: &mut Criterion) { + let (mut e1, mut e2) = build_shamir_engines(); + c.bench_function("shamir-32 single", |b| { + let input1 = vec![7.0]; + let input2 = vec![3.0]; + b.iter(|| { + thread::scope(|scope| { + let t1 = scope.spawn(|| { + black_box(e1.sum(&input1)); + }); + let t2 = scope.spawn(|| { + black_box(e2.sum(&input2)); + }); + t1.join().unwrap(); + t2.join().unwrap(); + }); + }); + }); + c.bench_function("shamir-32 vec32", |b| { + let input1 = vec![7.0; 32]; + let input2 = vec![3.0; 32]; + b.iter(|| { + thread::scope(|scope| { + let t1 = scope.spawn(|| { + black_box(e1.sum(&input1)); + }); + let t2 = scope.spawn(|| { + black_box(e2.sum(&input2)); + }); + t1.join().unwrap(); + t2.join().unwrap(); + }); + }); + }); + c.bench_function("shamir-32 vec64", |b| { + let input1 = vec![7.0; 64]; + let input2 = vec![3.0; 64]; + b.iter(|| { + thread::scope(|scope| { + let t1 = scope.spawn(|| { + black_box(e1.sum(&input1)); + }); + let t2 = scope.spawn(|| { + black_box(e2.sum(&input2)); + }); + t1.join().unwrap(); + t2.join().unwrap(); + }); + }); + }); + c.bench_function("shamir-32 vec128", |b| { + let input1 = vec![7.0; 128]; + let input2 = vec![3.0; 128]; + b.iter(|| { + thread::scope(|scope| { + let t1 = scope.spawn(|| { + black_box(e1.sum(&input1)); + }); + let t2 = scope.spawn(|| { + black_box(e2.sum(&input2)); + }); + t1.join().unwrap(); + t2.join().unwrap(); + }); + }); + }); + let _ = e1.shutdown(); + let _ = e2.shutdown(); +} + +criterion_group!(benches, criterion_benchmark); +criterion_main!(benches); diff --git a/wecare/benches/spdz-25519.rs b/wecare/benches/spdz-25519.rs index bfd5944..eeb7813 100644 --- a/wecare/benches/spdz-25519.rs +++ b/wecare/benches/spdz-25519.rs @@ -23,7 +23,7 @@ fn precompute(n: usize) -> (File, File) { } fn build_spdz_engines() -> (blocking::Engine, blocking::Engine) { - let (ctx1, ctx2) = precompute(10000000); + let (ctx1, mut ctx2) = precompute(10000000); let clock = time::Instant::now(); print!("Setting up engines..."); let _ = std::io::stdout().flush(); @@ -63,7 +63,7 @@ fn build_spdz_engines() -> (blocking::Engine, blocking::Engine) { fn criterion_benchmark(c: &mut Criterion) { let (mut e1, mut e2) = build_spdz_engines(); - c.bench_function("spdz single", |b| { + c.bench_function("spdz-25519 single", |b| { let input1 = vec![7.0]; let input2 = vec![3.0]; b.iter(|| { @@ -79,7 +79,7 @@ fn criterion_benchmark(c: &mut Criterion) { }); }); }); - c.bench_function("spdz vec32", |b| { + c.bench_function("spdz-25519 vec32", |b| { let input1 = vec![7.0; 32]; let input2 = vec![3.0; 32]; b.iter(|| { @@ -95,7 +95,7 @@ fn criterion_benchmark(c: &mut Criterion) { }); }); }); - c.bench_function("spdz vec64", |b| { + c.bench_function("spdz-25519 vec64", |b| { let input1 = vec![7.0; 64]; let input2 = vec![3.0; 64]; b.iter(|| { @@ -111,7 +111,7 @@ fn criterion_benchmark(c: &mut Criterion) { }); }); }); - c.bench_function("spdz vec128", |b| { + c.bench_function("spdz-25519 vec128", |b| { let input1 = vec![7.0; 128]; let input2 = vec![3.0; 128]; b.iter(|| { diff --git a/wecare/benches/spdz-32.rs b/wecare/benches/spdz-32.rs new file mode 100644 index 0000000..735f2ea --- /dev/null +++ b/wecare/benches/spdz-32.rs @@ -0,0 +1,135 @@ +use criterion::{criterion_group, criterion_main, Criterion}; +use std::time; +use std::{fs::File, hint::black_box, io::Seek, thread}; +use std::{io::Write, time::Duration}; +use wecare::{ + do_preproc, + vm::{blocking, Engine, FieldKind, SchemeKind}, +}; + +fn precompute(n: usize) -> (File, File) { + let clock = time::Instant::now(); + print!("\nPrecomputing..."); + let _ = std::io::stdout().flush(); + let ctx1 = tempfile::tempfile().unwrap(); + let ctx2 = tempfile::tempfile().unwrap(); + let mut files = [ctx1, ctx2]; + do_preproc(&mut files, &[n, n], 0, true).unwrap(); + let [mut ctx1, mut ctx2] = files; + ctx1.rewind().unwrap(); + ctx2.rewind().unwrap(); + println!(" Complete! (took {:#?})", clock.elapsed()); + (ctx1, ctx2) +} + +fn build_spdz_engines() -> (blocking::Engine, blocking::Engine) { + let (ctx1, ctx2) = precompute(10000000); + let clock = time::Instant::now(); + print!("Setting up engines..."); + let _ = std::io::stdout().flush(); + let (e1, e2) = thread::scope(|scope| { + let e2 = scope.spawn(|| { + Engine::builder() + .address("127.0.0.1:1234") + .participant("127.0.0.1:1235") + .preprocessed(ctx1) + .scheme(SchemeKind::Spdz) + .field(FieldKind::Element32) + .single_threaded_runtime() + .connect_blocking() + .unwrap() + .build() + .unwrap() + }); + let e1 = scope.spawn(|| { + thread::sleep(Duration::from_millis(200)); + Engine::builder() + .address("127.0.0.1:1235") + .participant("127.0.0.1:1234") + .preprocessed(ctx2) + .scheme(SchemeKind::Spdz) + .field(FieldKind::Element32) + .single_threaded_runtime() + .connect_blocking() + .unwrap() + .build() + .unwrap() + }); + (e1.join().unwrap(), e2.join().unwrap()) + }); + println!(" Complete! (took {:#?})", clock.elapsed()); + (e1, e2) +} + +fn criterion_benchmark(c: &mut Criterion) { + let (mut e1, mut e2) = build_spdz_engines(); + c.bench_function("spdz-32 single", |b| { + let input1 = vec![7.0]; + let input2 = vec![3.0]; + b.iter(|| { + thread::scope(|scope| { + let t1 = scope.spawn(|| { + black_box(e1.sum(&input1)); + }); + let t2 = scope.spawn(|| { + black_box(e2.sum(&input2)); + }); + t1.join().unwrap(); + t2.join().unwrap(); + }); + }); + }); + c.bench_function("spdz-32 vec32", |b| { + let input1 = vec![7.0; 32]; + let input2 = vec![3.0; 32]; + b.iter(|| { + thread::scope(|scope| { + let t1 = scope.spawn(|| { + black_box(e1.sum(&input1)); + }); + let t2 = scope.spawn(|| { + black_box(e2.sum(&input2)); + }); + t1.join().unwrap(); + t2.join().unwrap(); + }); + }); + }); + c.bench_function("spdz-32 vec64", |b| { + let input1 = vec![7.0; 64]; + let input2 = vec![3.0; 64]; + b.iter(|| { + thread::scope(|scope| { + let t1 = scope.spawn(|| { + black_box(e1.sum(&input1)); + }); + let t2 = scope.spawn(|| { + black_box(e2.sum(&input2)); + }); + t1.join().unwrap(); + t2.join().unwrap(); + }); + }); + }); + c.bench_function("spdz-32 vec128", |b| { + let input1 = vec![7.0; 128]; + let input2 = vec![3.0; 128]; + b.iter(|| { + thread::scope(|scope| { + let t1 = scope.spawn(|| { + black_box(e1.sum(&input1)); + }); + let t2 = scope.spawn(|| { + black_box(e2.sum(&input2)); + }); + t1.join().unwrap(); + t2.join().unwrap(); + }); + }); + }); + let _ = e1.shutdown(); + let _ = e2.shutdown(); +} + +criterion_group!(benches, criterion_benchmark); +criterion_main!(benches);