Skip to content

Commit a5d83f0

Browse files
diegokingstongabrielbosio
authored andcommitted
perf(fri): parallelize fold_evaluations_in_place with Rayon
Under the `parallel` feature, fold each conjugate pair concurrently using `par_chunks(2).zip(inv_twiddles.par_iter())`, collecting into a new Vec of half length. The sequential path (no `parallel` feature) is unchanged. This avoids the index aliasing issue from an in-place interleaved write.
1 parent 4da7fc7 commit a5d83f0

1 file changed

Lines changed: 31 additions & 7 deletions

File tree

crypto/stark/src/fri/fri_functions.rs

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,38 @@ pub fn fold_evaluations_in_place<F: IsSubFieldOf<E>, E: IsField>(
1818
inv_twiddles: &[FieldElement<F>],
1919
) {
2020
let half = evals.len() / 2;
21-
for j in 0..half {
22-
let lo = &evals[2 * j];
23-
let hi = &evals[2 * j + 1];
24-
let sum = lo + hi;
25-
let diff = lo - hi;
26-
evals[j] = &sum + &(&inv_twiddles[j] * &(zeta * &diff));
21+
22+
#[cfg(feature = "parallel")]
23+
{
24+
use rayon::prelude::*;
25+
// Evaluations are stored interleaved: pairs (evals[2j], evals[2j+1]).
26+
// Index-based iteration matches the sequential path and panics on a
27+
// short `inv_twiddles`; `par_chunks(2).zip(inv_twiddles)` would drop
28+
// a trailing odd element and silently truncate on length mismatch.
29+
let folded: Vec<FieldElement<E>> = (0..half)
30+
.into_par_iter()
31+
.map(|j| {
32+
let lo = &evals[2 * j];
33+
let hi = &evals[2 * j + 1];
34+
let sum = lo + hi;
35+
let diff = lo - hi;
36+
&sum + &(&inv_twiddles[j] * &(zeta * &diff))
37+
})
38+
.collect();
39+
*evals = folded;
40+
}
41+
42+
#[cfg(not(feature = "parallel"))]
43+
{
44+
for j in 0..half {
45+
let lo = &evals[2 * j];
46+
let hi = &evals[2 * j + 1];
47+
let sum = lo + hi;
48+
let diff = lo - hi;
49+
evals[j] = &sum + &(&inv_twiddles[j] * &(zeta * &diff));
50+
}
51+
evals.truncate(half);
2752
}
28-
evals.truncate(half);
2953
}
3054

3155
/// Compute inverse twiddle factors for evaluation-form FRI folding.

0 commit comments

Comments
 (0)