Skip to content

Commit

Permalink
opt: convert trace data to table (#215)
Browse files Browse the repository at this point in the history
* chore: refactor into_tables()

* chore: remove test

* chore: refactor join()

* chore: remove useless comments

* chore: modify according to the comments

* chore: modify according to the comments

* chore: modify according to the comments
  • Loading branch information
felicityin authored Jan 13, 2025
1 parent 19a3c5c commit bb9fb74
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 40 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@
/output
/examples/target
**/.DS_Store
mips-zkm-zkvm-elf
37 changes: 37 additions & 0 deletions prover/src/util.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ use plonky2::field::types::Field;
use plonky2::hash::hash_types::RichField;
use plonky2::iop::ext_target::ExtensionTarget;
use plonky2::util::transpose;
#[allow(unused_imports)]
use plonky2_maybe_rayon::rayon;

/// Construct an integer from its constituent bits (in little-endian order)
pub fn limb_from_bits_le<P: PackedField>(iter: impl IntoIterator<Item = P>) -> P {
Expand Down Expand Up @@ -68,3 +70,38 @@ pub fn u32_array_to_u8_vec(u32_array: &[u32; 8]) -> Vec<u8> {
}
u8_vec
}

macro_rules! join {
($($($a:expr),+$(,)?)?) => {
crate::util::__join!{0;;$($($a,)+)?}
};
}

macro_rules! __join {
($len:expr; $($f:ident $r:ident $a:expr),*; $b:expr, $($c:expr,)*) => {
crate::util::__join!{$len + 1; $($f $r $a,)* f r $b; $($c,)* }
};
($len:expr; $($f:ident $r:ident $a:expr),* ;) => {
match ($(Some(crate::util::__sendable_closure($a)),)*) {
($(mut $f,)*) => {
$(let mut $r = None;)*
let array: [&mut (dyn FnMut() + Send); $len] = [
$(&mut || $r = Some((&mut $f).take().unwrap()())),*
];
rayon::iter::ParallelIterator::for_each(
rayon::iter::IntoParallelIterator::into_par_iter(array),
|f| f(),
);
($($r.unwrap(),)*)
}
}
};
}

#[doc(hidden)]
pub(crate) fn __sendable_closure<R, F: FnOnce() -> R + Send>(x: F) -> F {
x
}

pub(crate) use __join;
pub(crate) use join;
59 changes: 19 additions & 40 deletions prover/src/witness/traces.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ use crate::keccak_sponge::keccak_sponge_stark::KeccakSpongeOp;
use crate::poseidon::constants::SPONGE_WIDTH;
use crate::poseidon_sponge::columns::POSEIDON_RATE_BYTES;
use crate::poseidon_sponge::poseidon_sponge_stark::PoseidonSpongeOp;
use crate::util::join;
use crate::util::trace_rows_to_poly_values;
use crate::witness::memory::MemoryOp;
use crate::{arithmetic, logic};
Expand Down Expand Up @@ -206,46 +207,24 @@ impl<T: Copy> Traces<T> {
timed!(
timing,
"convert trace to table parallelly",
rayon::join(
|| rayon::join(
|| memory_trace = all_stark.memory_stark.generate_trace(&mut memory_ops,),
|| arithmetic_trace =
all_stark.arithmetic_stark.generate_trace(&arithmetic_ops),
),
|| {
rayon::join(
|| {
cpu_trace = trace_rows_to_poly_values(
cpu.into_iter().map(|x| x.into()).collect(),
)
},
|| {
poseidon_trace = all_stark
.poseidon_stark
.generate_trace(&poseidon_inputs, min_rows)
},
);
rayon::join(
|| {
poseidon_sponge_trace = all_stark
.poseidon_sponge_stark
.generate_trace(&poseidon_sponge_ops, min_rows)
},
|| {
keccak_trace = all_stark
.keccak_stark
.generate_trace(keccak_inputs, min_rows)
},
);
rayon::join(
|| {
keccak_sponge_trace = all_stark
.keccak_sponge_stark
.generate_trace(keccak_sponge_ops, min_rows)
},
|| logic_trace = all_stark.logic_stark.generate_trace(logic_ops, min_rows),
);
},
join!(
|| memory_trace = all_stark.memory_stark.generate_trace(&mut memory_ops),
|| arithmetic_trace = all_stark.arithmetic_stark.generate_trace(&arithmetic_ops),
|| cpu_trace =
trace_rows_to_poly_values(cpu.into_iter().map(|x| x.into()).collect()),
|| poseidon_trace = all_stark
.poseidon_stark
.generate_trace(&poseidon_inputs, min_rows),
|| poseidon_sponge_trace = all_stark
.poseidon_sponge_stark
.generate_trace(&poseidon_sponge_ops, min_rows),
|| keccak_trace = all_stark
.keccak_stark
.generate_trace(keccak_inputs, min_rows),
|| keccak_sponge_trace = all_stark
.keccak_sponge_stark
.generate_trace(keccak_sponge_ops, min_rows),
|| logic_trace = all_stark.logic_stark.generate_trace(logic_ops, min_rows),
)
);

Expand Down

0 comments on commit bb9fb74

Please sign in to comment.