Browse Source

minor mods

par-agg-key-shares
Janmajaya Mall 10 months ago
parent
commit
6cea691749
8 changed files with 79 additions and 36 deletions
  1. +4
    -0
      Cargo.toml
  2. +38
    -0
      benches/modulus.rs
  3. +27
    -27
      src/bool/noise.rs
  4. +1
    -1
      src/bool/parameters.rs
  5. +1
    -4
      src/decomposer.rs
  6. +1
    -0
      src/lib.rs
  7. +5
    -4
      src/pbs.rs
  8. +2
    -0
      src/rgsw.rs

+ 4
- 0
Cargo.toml

@ -16,4 +16,8 @@ criterion = "0.5.1"
[[bench]]
name = "ntt"
harness = false
[[bench]]
name = "modulus"
harness = false

+ 38
- 0
benches/modulus.rs

@ -0,0 +1,38 @@
use bin_rs::{ModInit, ModularOpsU64, VectorOps};
use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion};
use itertools::Itertools;
use rand::{thread_rng, Rng};
use rand_distr::Uniform;
fn benchmark(c: &mut Criterion) {
let mut group = c.benchmark_group("modulus");
// 55
for prime in [36028797017456641] {
for ring_size in [1 << 11, 1 << 15] {
let modop = ModularOpsU64::new(prime);
let mut rng = thread_rng();
let dist = Uniform::new(0, prime);
let a0 = (&mut rng).sample_iter(dist).take(ring_size).collect_vec();
let a1 = (&mut rng).sample_iter(dist).take(ring_size).collect_vec();
let a2 = (&mut rng).sample_iter(dist).take(ring_size).collect_vec();
group.bench_function(
BenchmarkId::new("elwise_fma", format!("q={prime}/{ring_size}")),
|b| {
b.iter_batched_ref(
|| (a0.clone(), a1.clone(), a2.clone()),
|(a0, a1, a2)| black_box(modop.elwise_fma_mut(a0, a1, a2)),
criterion::BatchSize::PerIteration,
)
},
);
}
}
group.finish();
}
criterion_group!(modulus, benchmark);
criterion_main!(modulus);

+ 27
- 27
src/bool/noise.rs

@ -95,12 +95,12 @@ mod test {
let true_el_encoded = evaluator.parameters().rlwe_q().true_el();
let false_el_encoded = evaluator.parameters().rlwe_q().false_el();
let mut stats = Stats::new();
// let mut stats = Stats::new();
for _ in 0..1000 {
// let now = std::time::Instant::now();
let now = std::time::Instant::now();
let c_out = evaluator.xor(&c_m0, &c_m1, &server_key_eval_domain);
// println!("Gate time: {:?}", now.elapsed());
println!("Gate time: {:?}", now.elapsed());
// mp decrypt
let decryption_shares = cks
@ -111,36 +111,36 @@ mod test {
let m_expected = (m0 ^ m1);
assert_eq!(m_expected, m_out, "Expected {m_expected} but got {m_out}");
// find noise update
{
let out = decrypt_lwe(
&c_out,
ideal_client_key.sk_rlwe().values(),
evaluator.pbs_info().modop_rlweq(),
);
let out_want = {
if m_expected == true {
true_el_encoded
} else {
false_el_encoded
}
};
let diff = evaluator.pbs_info().modop_rlweq().sub(&out, &out_want);
stats.add_more(&vec![evaluator
.pbs_info()
.rlwe_q()
.map_element_to_i64(&diff)]);
}
// // find noise update
// {
// let out = decrypt_lwe(
// &c_out,
// ideal_client_key.sk_rlwe().values(),
// evaluator.pbs_info().modop_rlweq(),
// );
// let out_want = {
// if m_expected == true {
// true_el_encoded
// } else {
// false_el_encoded
// }
// };
// let diff = evaluator.pbs_info().modop_rlweq().sub(&out, &out_want);
// stats.add_more(&vec![evaluator
// .pbs_info()
// .rlwe_q()
// .map_element_to_i64(&diff)]);
// }
m1 = m0;
m0 = m_out;
m0 = m_expected;
c_m1 = c_m0;
c_m0 = c_out;
}
println!("log2 std dev {}", stats.std_dev().abs().log2());
// println!("log2 std dev {}", stats.std_dev().abs().log2());
}
}

+ 1
- 1
src/bool/parameters.rs

@ -337,7 +337,7 @@ pub(crate) const SMALL_MP_BOOL_PARAMS: BoolParameters = BoolParameters::
lwe_decomposer_base: DecompostionLogBase(4),
lwe_decomposer_count: DecompositionCount(5),
rlrg_decomposer_base: DecompostionLogBase(11),
rlrg_decomposer_count: (DecompositionCount(2), DecompositionCount(2)),
rlrg_decomposer_count: (DecompositionCount(2), DecompositionCount(1)),
rgrg_decomposer_base: DecompostionLogBase(11),
rgrg_decomposer_count: (DecompositionCount(5), DecompositionCount(4)),
auto_decomposer_base: DecompostionLogBase(11),

+ 1
- 4
src/decomposer.rs

@ -119,10 +119,7 @@ impl Decompose
}
}
/// Signed BNAF decomposition. Only returns most significant `d`
/// decomposition limbs
///
/// Implements algorithm 3 of https://eprint.iacr.org/2021/1161.pdf
// TODO(Jay): Outline the caveat
fn decompose(&self, value: &T) -> Vec<T> {
let mut value = round_value(*value, self.ignore_bits);

+ 1
- 0
src/lib.rs

@ -20,6 +20,7 @@ mod rgsw;
mod shortint;
mod utils;
pub use backend::{ModInit, ModularOpsU64, VectorOps};
pub use ntt::{Ntt, NttBackendU64, NttInit};
pub trait Matrix: AsRef<[Self::R]> {

+ 5
- 4
src/pbs.rs

@ -240,7 +240,7 @@ fn blind_rotation<
let s_indices = &gk_to_si[q_by_4 + i];
s_indices.iter().for_each(|s_index| {
let new = std::time::Instant::now();
// let new = std::time::Instant::now();
rlwe_by_rgsw(
trivial_rlwe_test_poly,
pbs_key.rgsw_ct_lwe_si(*s_index),
@ -249,14 +249,14 @@ fn blind_rotation<
ntt_op,
mod_op,
);
println!("Rlwe x Rgsw time: {:?}", new.elapsed());
// println!("Rlwe x Rgsw time: {:?}", new.elapsed());
});
v += 1;
if gk_to_si[q_by_4 + i - 1].len() != 0 || v == w || i == 1 {
let (auto_map_index, auto_map_sign) = parameters.rlwe_auto_map(v);
let now = std::time::Instant::now();
// let now = std::time::Instant::now();
galois_auto(
trivial_rlwe_test_poly,
pbs_key.galois_key_for_auto(v),
@ -267,7 +267,7 @@ fn blind_rotation<
ntt_op,
auto_decomposer,
);
println!("Auto time: {:?}", now.elapsed());
// println!("Auto time: {:?}", now.elapsed());
count += 1;
v = 0;
@ -296,6 +296,7 @@ fn blind_rotation<
ntt_op,
auto_decomposer,
);
count += 1;
// +(g^k)
let mut v = 0;

+ 2
- 0
src/rgsw.rs

@ -791,6 +791,7 @@ pub(crate) fn rlwe_by_rgsw<
);
scratch_matrix_d_ring
.iter_mut()
.take(d_a)
.for_each(|r| ntt_op.forward(r.as_mut()));
// a_out += decomp<a_in> \cdot RLWE_A'(-sm)
routine(
@ -815,6 +816,7 @@ pub(crate) fn rlwe_by_rgsw<
);
scratch_matrix_d_ring
.iter_mut()
.take(d_b)
.for_each(|r| ntt_op.forward(r.as_mut()));
// a_out += decomp<b_in> \cdot RLWE_A'(m)
routine(

Loading…
Cancel
Save