mirror of https://github.com/zcash/halo2.git
optimize Params<C>::read()
This commit is contained in:
parent
14263e9208
commit
c1f77ad576
|
@ -1,6 +1,8 @@
|
||||||
//! This module provides common utilities, traits and structures for group,
|
//! This module provides common utilities, traits and structures for group,
|
||||||
//! field and polynomial arithmetic.
|
//! field and polynomial arithmetic.
|
||||||
|
|
||||||
|
use std::io;
|
||||||
|
|
||||||
use super::multicore;
|
use super::multicore;
|
||||||
pub use ff::Field;
|
pub use ff::Field;
|
||||||
use group::{
|
use group::{
|
||||||
|
@ -352,6 +354,42 @@ pub fn parallelize<T: Send, F: Fn(&mut [T], usize) + Send + Sync + Clone>(v: &mu
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// This simple utility function will parallelize an operation returning `io::Result` that is to be
|
||||||
|
/// performed over a mutable slice.
|
||||||
|
pub fn parallelize_is_ok<
|
||||||
|
T: Send,
|
||||||
|
F: Fn(&mut [T], usize) -> io::Result<()> + Send + Sync + Clone,
|
||||||
|
>(
|
||||||
|
v: &mut [T],
|
||||||
|
f: F,
|
||||||
|
) -> io::Result<()> {
|
||||||
|
let n = v.len();
|
||||||
|
let num_threads = multicore::current_num_threads();
|
||||||
|
let mut chunk = (n as usize) / num_threads;
|
||||||
|
if chunk < num_threads {
|
||||||
|
chunk = n as usize;
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut is_ok = true;
|
||||||
|
multicore::scope(|scope| {
|
||||||
|
for (chunk_num, v) in v.chunks_mut(chunk).enumerate() {
|
||||||
|
let f = f.clone();
|
||||||
|
scope.spawn(move |_| {
|
||||||
|
let start = chunk_num * chunk;
|
||||||
|
is_ok = is_ok && f(v, start).is_ok();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
match is_ok {
|
||||||
|
true => Ok(()),
|
||||||
|
false => Err(io::Error::new(
|
||||||
|
io::ErrorKind::Other,
|
||||||
|
"invalid point encoding in proof",
|
||||||
|
)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn log2_floor(num: usize) -> u32 {
|
fn log2_floor(num: usize) -> u32 {
|
||||||
assert!(num > 0);
|
assert!(num > 0);
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,11 @@ pub(crate) trait CurveRead: CurveAffine {
|
||||||
Option::from(Self::from_bytes(&compressed))
|
Option::from(Self::from_bytes(&compressed))
|
||||||
.ok_or_else(|| io::Error::new(io::ErrorKind::Other, "invalid point encoding in proof"))
|
.ok_or_else(|| io::Error::new(io::ErrorKind::Other, "invalid point encoding in proof"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn convert_from_bytes(compressed: Self::Repr) -> io::Result<Self> {
|
||||||
|
Option::from(Self::from_bytes(&compressed))
|
||||||
|
.ok_or_else(|| io::Error::new(io::ErrorKind::Other, "invalid point encoding in proof"))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<C: CurveAffine> CurveRead for C {}
|
impl<C: CurveAffine> CurveRead for C {}
|
||||||
|
|
|
@ -5,7 +5,8 @@
|
||||||
|
|
||||||
use super::{Coeff, LagrangeCoeff, Polynomial, MSM};
|
use super::{Coeff, LagrangeCoeff, Polynomial, MSM};
|
||||||
use crate::arithmetic::{
|
use crate::arithmetic::{
|
||||||
best_fft, best_multiexp, parallelize, CurveAffine, CurveExt, Engine, FieldExt, Group,
|
best_fft, best_multiexp, parallelize, parallelize_is_ok, CurveAffine, CurveExt, Engine,
|
||||||
|
FieldExt, Group,
|
||||||
};
|
};
|
||||||
use crate::helpers::CurveRead;
|
use crate::helpers::CurveRead;
|
||||||
|
|
||||||
|
@ -177,12 +178,45 @@ impl<C: CurveAffine> Params<C> {
|
||||||
let k = u32::from_le_bytes(k);
|
let k = u32::from_le_bytes(k);
|
||||||
let n = 1 << k;
|
let n = 1 << k;
|
||||||
|
|
||||||
let g: Vec<C> = (0..n)
|
let mut g_compressed: Vec<C::Repr> = vec![C::Repr::default(); n];
|
||||||
.map(|_| C::read(&mut reader))
|
for i in 0..n {
|
||||||
.collect::<Result<_, _>>()?;
|
reader.read_exact(g_compressed[i].as_mut())?;
|
||||||
let g_lagrange: Vec<C> = (0..n)
|
}
|
||||||
.map(|_| C::read(&mut reader))
|
|
||||||
.collect::<Result<_, _>>()?;
|
let mut g_lagrange_compressed: Vec<C::Repr> = vec![C::Repr::default(); n];
|
||||||
|
for i in 0..n {
|
||||||
|
reader.read_exact(g_lagrange_compressed[i].as_mut())?;
|
||||||
|
}
|
||||||
|
|
||||||
|
let g: Vec<C> = {
|
||||||
|
let mut g = vec![C::default(); n];
|
||||||
|
parallelize_is_ok(&mut g, |g, chunks| {
|
||||||
|
for (i, g) in g.iter_mut().enumerate() {
|
||||||
|
let tmp = C::convert_from_bytes(g_compressed[chunks + i]);
|
||||||
|
*g = match tmp {
|
||||||
|
Ok(ele) => ele,
|
||||||
|
Err(e) => return Err(e),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
})?;
|
||||||
|
g
|
||||||
|
};
|
||||||
|
|
||||||
|
let g_lagrange: Vec<C> = {
|
||||||
|
let mut g_lagrange = vec![C::default(); n];
|
||||||
|
parallelize_is_ok(&mut g_lagrange, |g_lagrange, chunks| {
|
||||||
|
for (i, g_lagrange) in g_lagrange.iter_mut().enumerate() {
|
||||||
|
let tmp = C::convert_from_bytes(g_lagrange_compressed[chunks + i]);
|
||||||
|
*g_lagrange = match tmp {
|
||||||
|
Ok(ele) => ele,
|
||||||
|
Err(e) => return Err(e),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
})?;
|
||||||
|
g_lagrange
|
||||||
|
};
|
||||||
|
|
||||||
let mut additional_data_len = [0u8; 4];
|
let mut additional_data_len = [0u8; 4];
|
||||||
reader.read_exact(&mut additional_data_len[..])?;
|
reader.read_exact(&mut additional_data_len[..])?;
|
||||||
|
@ -193,7 +227,7 @@ impl<C: CurveAffine> Params<C> {
|
||||||
|
|
||||||
Ok(Params {
|
Ok(Params {
|
||||||
k,
|
k,
|
||||||
n,
|
n: n as u64,
|
||||||
g,
|
g,
|
||||||
g_lagrange,
|
g_lagrange,
|
||||||
additional_data,
|
additional_data,
|
||||||
|
|
Loading…
Reference in New Issue