Skip to content

Commit df18280

Browse files
Performance Optimizations (#5)
Enabling Lazy NTT, giving a speedup of about 2x for encryption/decryption/rerandomization. * Updated version to 0.2.0 * added poly operation benchmarks * added butterfly mod and tests * cleaned up interfaces. * basic lazy butterfly tests work * lazy butterfly and tests * added trait and tests for lazy transforms * swap * switch to use split_at * added lazy (i)ntt; tests pass. * conditional compilation * benchmarking * optimized performance by pure u64 impl * added benchmark for integer ops and gaussian sampling * sample ternary * optimized uniform sampling * clean up * enabled lazy ntt by default * fixing reviewer comments * fix underflow * further addressing comments * updating version to 0.2.1 * remove unused dependencies Co-authored-by: Hao Chen <[email protected]>
1 parent c8ee75a commit df18280

22 files changed

+1086
-532
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
/target
22
Cargo.lock
3+
src/*.md

CHANGELOG.md

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
## 0.2.1 (August 30, 2021)
2+
3+
* Performance optimizations: Faster encryption/decryption based on lazy NTT
4+
5+
## 0.2.0 (June 1, 2021)
6+
7+
* Added serailization support
8+
* Added ability to customize plaintext modulus

Cargo.toml

+18-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "Cupcake"
3-
version = "0.1.1"
3+
version = "0.2.1"
44
authors = ["Hao Chen <[email protected]>"]
55
license = "MIT"
66
edition = "2018"
@@ -20,12 +20,28 @@ bencher = "0.1.5"
2020
name = "cupcake"
2121
path = "src/lib.rs"
2222

23+
[features]
24+
bench = []
25+
2326
[[example]]
2427
name = "basic"
2528

2629
[[example]]
2730
name = "serialization"
2831

2932
[[bench]]
30-
name = "example"
33+
name = "scheme"
34+
harness = false
35+
36+
[[bench]]
37+
name = "polyops"
38+
harness = false
39+
required-features = ["bench"]
40+
41+
[[bench]]
42+
name = "butterfly"
43+
harness = false
44+
45+
[[bench]]
46+
name = "integerops"
3147
harness = false

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ Cupcake requires or works with
1111
## Installation
1212
Add the following line to the dependencies of your Cargo.toml:
1313
```
14-
Cupcake = "0.1.1"
14+
Cupcake = "0.2.1"
1515
```
1616

1717
## Building from source

benches/butterfly.rs

+73
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
// Copyright (c) Facebook, Inc. and its affiliates.
2+
//
3+
// This source code is licensed under the MIT license found in the
4+
// LICENSE file in the root directory of this source tree.
5+
#[macro_use]
6+
extern crate bencher;
7+
use bencher::Bencher;
8+
use cupcake::integer_arith::butterfly::{
9+
butterfly, inverse_butterfly, lazy_butterfly, lazy_butterfly_u64,
10+
};
11+
use cupcake::integer_arith::scalar::Scalar;
12+
use cupcake::integer_arith::ArithUtils;
13+
14+
#[allow(non_snake_case)]
15+
fn bench_butterfly(bench: &mut Bencher) {
16+
let q = Scalar::new_modulus(18014398492704769u64);
17+
let x = rand::random::<u64>();
18+
let y = rand::random::<u64>();
19+
let w = rand::random::<u64>();
20+
21+
let mut X = Scalar::from(x);
22+
let mut Y = Scalar::from(y);
23+
let W = Scalar::from(w);
24+
25+
bench.iter(|| {
26+
let _ = butterfly(&mut X, &mut Y, &W, &q);
27+
})
28+
}
29+
30+
#[allow(non_snake_case)]
31+
fn bench_inverse_butterfly(bench: &mut Bencher) {
32+
let q = Scalar::new_modulus(18014398492704769u64);
33+
let x = rand::random::<u64>();
34+
let y = rand::random::<u64>();
35+
let w = rand::random::<u64>();
36+
37+
let mut X = Scalar::from(x);
38+
let mut Y = Scalar::from(y);
39+
let W = Scalar::from(w);
40+
41+
bench.iter(|| {
42+
let _ = inverse_butterfly(&mut X, &mut Y, &W, &q);
43+
})
44+
}
45+
46+
#[allow(non_snake_case)]
47+
fn bench_lazy_butterfly(bench: &mut Bencher) {
48+
let q = Scalar::new_modulus(18014398492704769u64);
49+
let x = rand::random::<u64>();
50+
let y = rand::random::<u64>();
51+
let w = rand::random::<u64>();
52+
53+
let mut X = Scalar::from(x);
54+
let mut Y = Scalar::from(y);
55+
let W = Scalar::from(w);
56+
57+
let Wprime: u64 = cupcake::integer_arith::util::compute_harvey_ratio(W.rep(), q.rep());
58+
59+
let twoq: u64 = q.rep() << 1;
60+
61+
bench.iter(|| {
62+
let _ = lazy_butterfly_u64(x, y, W.rep(), Wprime, q.rep(), twoq);
63+
})
64+
}
65+
66+
benchmark_group!(
67+
butterfly_group,
68+
bench_butterfly,
69+
bench_inverse_butterfly,
70+
bench_lazy_butterfly
71+
);
72+
73+
benchmark_main!(butterfly_group);

0 commit comments

Comments
 (0)