mirror of
https://github.com/arnaucube/hyperplonk.git
synced 2026-01-10 16:11:29 +01:00
improve compute_sum parallelism (#14)
This commit is contained in:
@@ -212,7 +212,7 @@ impl<F: PrimeField> SumCheck<F> for PolyIOP<F> {
|
|||||||
domain_info: &Self::DomainInfo,
|
domain_info: &Self::DomainInfo,
|
||||||
transcript: &mut Self::Transcript,
|
transcript: &mut Self::Transcript,
|
||||||
) -> Result<Self::SubClaim, PolyIOPErrors> {
|
) -> Result<Self::SubClaim, PolyIOPErrors> {
|
||||||
let start = start_timer!(|| "sum check prove");
|
let start = start_timer!(|| "sum check verify");
|
||||||
|
|
||||||
transcript.append_domain_info(domain_info)?;
|
transcript.append_domain_info(domain_info)?;
|
||||||
let mut verifier_state = VerifierState::verifier_init(domain_info);
|
let mut verifier_state = VerifierState::verifier_init(domain_info);
|
||||||
|
|||||||
@@ -122,39 +122,38 @@ impl<F: PrimeField> SumCheckProver<F> for ProverState<F> {
|
|||||||
|
|
||||||
let compute_sum = start_timer!(|| "compute sum");
|
let compute_sum = start_timer!(|| "compute sum");
|
||||||
// generate sum
|
// generate sum
|
||||||
for b in 0..1 << (nv - i) {
|
#[cfg(feature = "parallel")]
|
||||||
#[cfg(feature = "parallel")]
|
products_sum.par_iter_mut().enumerate().for_each(|(t, e)| {
|
||||||
products_sum
|
for b in 0..1 << (nv - i) {
|
||||||
.par_iter_mut()
|
// evaluate P_round(t)
|
||||||
.take(degree + 1)
|
for (coefficient, products) in products.iter() {
|
||||||
.enumerate()
|
let num_multiplicands = products.len();
|
||||||
.for_each(|(i, e)| {
|
let mut product = *coefficient;
|
||||||
// evaluate P_round(t)
|
for &f in products.iter().take(num_multiplicands) {
|
||||||
for (coefficient, products) in products.iter() {
|
let table = &flattened_ml_extensions[f]; // f's range is checked in init
|
||||||
let num_multiplicands = products.len();
|
product *= table[b << 1] * (F::one() - F::from(t as u64))
|
||||||
let mut product = *coefficient;
|
+ table[(b << 1) + 1] * F::from(t as u64);
|
||||||
for &f in products.iter().take(num_multiplicands) {
|
|
||||||
let table = &flattened_ml_extensions[f]; // f's range is checked in init
|
|
||||||
product *= table[b << 1] * (F::one() - F::from(i as u64))
|
|
||||||
+ table[(b << 1) + 1] * F::from(i as u64);
|
|
||||||
}
|
|
||||||
*e += product;
|
|
||||||
}
|
}
|
||||||
});
|
*e += product;
|
||||||
#[cfg(not(feature = "parallel"))]
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
#[cfg(not(feature = "parallel"))]
|
||||||
|
for b in 0..1 << (nv - i) {
|
||||||
products_sum
|
products_sum
|
||||||
.iter_mut()
|
.iter_mut()
|
||||||
.take(degree + 1)
|
.take(degree + 1)
|
||||||
.enumerate()
|
.enumerate()
|
||||||
.for_each(|(i, e)| {
|
.for_each(|(t, e)| {
|
||||||
// evaluate P_round(t)
|
// evaluate P_round(t)
|
||||||
for (coefficient, products) in products.iter() {
|
for (coefficient, products) in products.iter() {
|
||||||
let num_multiplicands = products.len();
|
let num_multiplicands = products.len();
|
||||||
let mut product = *coefficient;
|
let mut product = *coefficient;
|
||||||
for &f in products.iter().take(num_multiplicands) {
|
for &f in products.iter().take(num_multiplicands) {
|
||||||
let table = &flattened_ml_extensions[f]; // f's range is checked in init
|
let table = &flattened_ml_extensions[f]; // f's range is checked in init
|
||||||
product *= table[b << 1] * (F::one() - F::from(i as u64))
|
product *= table[b << 1] * (F::one() - F::from(t as u64))
|
||||||
+ table[(b << 1) + 1] * F::from(i as u64);
|
+ table[(b << 1) + 1] * F::from(t as u64);
|
||||||
}
|
}
|
||||||
*e += product;
|
*e += product;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user