Skip to content

Commit 3f5214f

Browse files
authored
sumcheck skip send p0 (#1247)
Related to #1233 refer https://eprint.iacr.org/2024/108.pdf "sec 3.1" ### benchmark send one less interpolation show significant improvement on `prove_tower_relation_gpu`. For `prove_main_constraints`, `pcs_opening` there is no significant different and most likely noise | Operation | master (s) | degree-1 (s) | Improve (master→degree-1) | |------------------------------|------------|---------------|----------------------------| | prove_tower_relation_gpu | 32.689 | 26.446 | -19.14% | | prove_main_constraints | 9.932 | 10.146 | +2.15% | | pcs_opening | 19.081 | 19.386 | +1.60% | | Layer | master (s) | degree-1 (s) | Improve (master→degree-1) | |-----------|-------------|--------------|----------------------------| | app_prove | 87.000 | 82.100 | 5.63% | raw data - master https://github.com/scroll-tech/ceno-reth-benchmark/blob/gh-pages/benchmarks-dispatch/refs/heads/feat/latest/mainnet23817600-20260126-165027_summary.md - degree -1 https://github.com/scroll-tech/ceno-reth-benchmark/blob/gh-pages/benchmarks-dispatch/refs/heads/feat/latest/mainnet23817600-20260128-161951_summary.md > after degree - 1 now trigger more gap, we need to optimize per shard step records generation + witness assignment
1 parent 67092de commit 3f5214f

File tree

9 files changed

+100
-180
lines changed

9 files changed

+100
-180
lines changed

Cargo.lock

Lines changed: 11 additions & 11 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,16 @@ version = "0.1.0"
2727
ceno_crypto_primitives = { git = "https://github.com/scroll-tech/ceno-patch.git", package = "ceno_crypto_primitives", branch = "main" }
2828
ceno_syscall = { git = "https://github.com/scroll-tech/ceno-patch.git", package = "ceno_syscall", branch = "main" }
2929

30-
ff_ext = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "ff_ext", tag = "v1.0.0-alpha.20" }
31-
mpcs = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "mpcs", tag = "v1.0.0-alpha.20" }
32-
multilinear_extensions = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "multilinear_extensions", tag = "v1.0.0-alpha.20" }
33-
p3 = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "p3", tag = "v1.0.0-alpha.20" }
34-
poseidon = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "poseidon", tag = "v1.0.0-alpha.20" }
35-
sp1-curves = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "sp1-curves", tag = "v1.0.0-alpha.20" }
36-
sumcheck = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "sumcheck", tag = "v1.0.0-alpha.20" }
37-
transcript = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "transcript", tag = "v1.0.0-alpha.20" }
38-
whir = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "whir", tag = "v1.0.0-alpha.20" }
39-
witness = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "witness", tag = "v1.0.0-alpha.20" }
30+
ff_ext = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "ff_ext", tag = "v1.0.0-alpha.21" }
31+
mpcs = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "mpcs", tag = "v1.0.0-alpha.21" }
32+
multilinear_extensions = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "multilinear_extensions", tag = "v1.0.0-alpha.21" }
33+
p3 = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "p3", tag = "v1.0.0-alpha.21" }
34+
poseidon = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "poseidon", tag = "v1.0.0-alpha.21" }
35+
sp1-curves = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "sp1-curves", tag = "v1.0.0-alpha.21" }
36+
sumcheck = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "sumcheck", tag = "v1.0.0-alpha.21" }
37+
transcript = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "transcript", tag = "v1.0.0-alpha.21" }
38+
whir = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "whir", tag = "v1.0.0-alpha.21" }
39+
witness = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "witness", tag = "v1.0.0-alpha.21" }
4040

4141
anyhow = { version = "1.0", default-features = false }
4242
bincode = "1"

ceno_recursion/src/arithmetics/mod.rs

Lines changed: 40 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -866,35 +866,51 @@ impl<C: Config> UniPolyExtrapolator<C> {
866866
}
867867

868868
pub fn extrapolate_uni_poly(
869-
&mut self,
869+
&self,
870870
builder: &mut Builder<C>,
871+
p_0: Ext<C::F, C::EF>,
871872
p_i: &Array<C, Ext<C::F, C::EF>>,
872873
eval_at: Ext<C::F, C::EF>,
873874
) -> Ext<C::F, C::EF> {
874875
let res: Ext<C::F, C::EF> = builder.constant(C::EF::ZERO);
876+
let length: RVar<_> = builder.eval_expr(p_i.len() + Usize::from(1));
875877

876-
builder.if_eq(p_i.len(), Usize::from(4)).then_or_else(
878+
builder.if_eq(length, Usize::from(4)).then_or_else(
877879
|builder| {
878-
let ext = self.extrapolate_uni_poly_deg_3(builder, p_i, eval_at);
880+
let p_i_1: Ext<C::F, C::EF> = builder.get(p_i, 0);
881+
let p_i_2: Ext<C::F, C::EF> = builder.get(p_i, 1);
882+
let p_i_3: Ext<C::F, C::EF> = builder.get(p_i, 2);
883+
let ext =
884+
self.extrapolate_uni_poly_deg_3(builder, p_0, p_i_1, p_i_2, p_i_3, eval_at);
879885
builder.assign(&res, ext);
880886
},
881887
|builder| {
882-
builder.if_eq(p_i.len(), Usize::from(3)).then_or_else(
888+
builder.if_eq(length, Usize::from(3)).then_or_else(
883889
|builder| {
884-
let ext = self.extrapolate_uni_poly_deg_2(builder, p_i, eval_at);
890+
let p_i_1: Ext<C::F, C::EF> = builder.get(p_i, 0);
891+
let p_i_2: Ext<C::F, C::EF> = builder.get(p_i, 1);
892+
let ext =
893+
self.extrapolate_uni_poly_deg_2(builder, p_0, p_i_1, p_i_2, eval_at);
885894
builder.assign(&res, ext);
886895
},
887896
|builder| {
888-
builder.if_eq(p_i.len(), Usize::from(2)).then_or_else(
897+
builder.if_eq(length, Usize::from(2)).then_or_else(
889898
|builder| {
890-
let ext = self.extrapolate_uni_poly_deg_1(builder, p_i, eval_at);
899+
let p_i_1: Ext<C::F, C::EF> = builder.get(p_i, 0);
900+
let ext =
901+
self.extrapolate_uni_poly_deg_1(builder, p_0, p_i_1, eval_at);
891902
builder.assign(&res, ext);
892903
},
893904
|builder| {
894-
builder.if_eq(p_i.len(), Usize::from(5)).then_or_else(
905+
builder.if_eq(length, Usize::from(5)).then_or_else(
895906
|builder| {
896-
let ext =
897-
self.extrapolate_uni_poly_deg_4(builder, p_i, eval_at);
907+
let p_i_1: Ext<C::F, C::EF> = builder.get(p_i, 0);
908+
let p_i_2: Ext<C::F, C::EF> = builder.get(p_i, 1);
909+
let p_i_3: Ext<C::F, C::EF> = builder.get(p_i, 2);
910+
let p_i_4: Ext<C::F, C::EF> = builder.get(p_i, 3);
911+
let ext = self.extrapolate_uni_poly_deg_4(
912+
builder, p_0, p_i_1, p_i_2, p_i_3, p_i_4, eval_at,
913+
);
898914
builder.assign(&res, ext);
899915
},
900916
|builder| {
@@ -914,7 +930,8 @@ impl<C: Config> UniPolyExtrapolator<C> {
914930
fn extrapolate_uni_poly_deg_1(
915931
&self,
916932
builder: &mut Builder<C>,
917-
p_i: &Array<C, Ext<C::F, C::EF>>,
933+
p_i_0: Ext<C::F, C::EF>,
934+
p_i_1: Ext<C::F, C::EF>,
918935
eval_at: Ext<C::F, C::EF>,
919936
) -> Ext<C::F, C::EF> {
920937
// w0 = 1 / (0−1) = -1
@@ -923,9 +940,6 @@ impl<C: Config> UniPolyExtrapolator<C> {
923940
let d1: Ext<C::F, C::EF> = builder.eval(eval_at - self.constants[1]);
924941
let l: Ext<C::F, C::EF> = builder.eval(d0 * d1);
925942

926-
let p_i_0 = builder.get(p_i, 0);
927-
let p_i_1 = builder.get(p_i, 1);
928-
929943
let t0: Ext<C::F, C::EF> = builder.eval(self.constants[5] * p_i_0 * d0.inverse());
930944
let t1: Ext<C::F, C::EF> = builder.eval(self.constants[1] * p_i_1 * d1.inverse());
931945

@@ -935,7 +949,9 @@ impl<C: Config> UniPolyExtrapolator<C> {
935949
fn extrapolate_uni_poly_deg_2(
936950
&self,
937951
builder: &mut Builder<C>,
938-
p_i: &Array<C, Ext<C::F, C::EF>>,
952+
p_i_0: Ext<C::F, C::EF>,
953+
p_i_1: Ext<C::F, C::EF>,
954+
p_i_2: Ext<C::F, C::EF>,
939955
eval_at: Ext<C::F, C::EF>,
940956
) -> Ext<C::F, C::EF> {
941957
// w0 = 1 / ((0−1)(0−2)) = 1/2
@@ -947,10 +963,6 @@ impl<C: Config> UniPolyExtrapolator<C> {
947963

948964
let l: Ext<C::F, C::EF> = builder.eval(d0 * d1 * d2);
949965

950-
let p_i_0: Ext<C::F, C::EF> = builder.get(p_i, 0);
951-
let p_i_1: Ext<C::F, C::EF> = builder.get(p_i, 1);
952-
let p_i_2: Ext<C::F, C::EF> = builder.get(p_i, 2);
953-
954966
let t0: Ext<C::F, C::EF> = builder.eval(self.constants[6] * p_i_0 * d0.inverse());
955967
let t1: Ext<C::F, C::EF> = builder.eval(self.constants[5] * p_i_1 * d1.inverse());
956968
let t2: Ext<C::F, C::EF> = builder.eval(self.constants[6] * p_i_2 * d2.inverse());
@@ -961,7 +973,10 @@ impl<C: Config> UniPolyExtrapolator<C> {
961973
fn extrapolate_uni_poly_deg_3(
962974
&self,
963975
builder: &mut Builder<C>,
964-
p_i: &Array<C, Ext<C::F, C::EF>>,
976+
p_i_0: Ext<C::F, C::EF>,
977+
p_i_1: Ext<C::F, C::EF>,
978+
p_i_2: Ext<C::F, C::EF>,
979+
p_i_3: Ext<C::F, C::EF>,
965980
eval_at: Ext<C::F, C::EF>,
966981
) -> Ext<C::F, C::EF> {
967982
// w0 = 1 / ((0−1)(0−2)(0−3)) = -1/6
@@ -975,11 +990,6 @@ impl<C: Config> UniPolyExtrapolator<C> {
975990

976991
let l: Ext<C::F, C::EF> = builder.eval(d0 * d1 * d2 * d3);
977992

978-
let p_i_0: Ext<C::F, C::EF> = builder.get(p_i, 0);
979-
let p_i_1: Ext<C::F, C::EF> = builder.get(p_i, 1);
980-
let p_i_2: Ext<C::F, C::EF> = builder.get(p_i, 2);
981-
let p_i_3: Ext<C::F, C::EF> = builder.get(p_i, 3);
982-
983993
let t0: Ext<C::F, C::EF> = builder.eval(self.constants[9] * p_i_0 * d0.inverse());
984994
let t1: Ext<C::F, C::EF> = builder.eval(self.constants[6] * p_i_1 * d1.inverse());
985995
let t2: Ext<C::F, C::EF> = builder.eval(self.constants[7] * p_i_2 * d2.inverse());
@@ -991,7 +1001,11 @@ impl<C: Config> UniPolyExtrapolator<C> {
9911001
fn extrapolate_uni_poly_deg_4(
9921002
&self,
9931003
builder: &mut Builder<C>,
994-
p_i: &Array<C, Ext<C::F, C::EF>>,
1004+
p_i_0: Ext<C::F, C::EF>,
1005+
p_i_1: Ext<C::F, C::EF>,
1006+
p_i_2: Ext<C::F, C::EF>,
1007+
p_i_3: Ext<C::F, C::EF>,
1008+
p_i_4: Ext<C::F, C::EF>,
9951009
eval_at: Ext<C::F, C::EF>,
9961010
) -> Ext<C::F, C::EF> {
9971011
// w0 = 1 / ((0−1)(0−2)(0−3)(0−4)) = 1/24
@@ -1007,12 +1021,6 @@ impl<C: Config> UniPolyExtrapolator<C> {
10071021

10081022
let l: Ext<C::F, C::EF> = builder.eval(d0 * d1 * d2 * d3 * d4);
10091023

1010-
let p_i_0: Ext<C::F, C::EF> = builder.get(p_i, 0);
1011-
let p_i_1: Ext<C::F, C::EF> = builder.get(p_i, 1);
1012-
let p_i_2: Ext<C::F, C::EF> = builder.get(p_i, 2);
1013-
let p_i_3: Ext<C::F, C::EF> = builder.get(p_i, 3);
1014-
let p_i_4: Ext<C::F, C::EF> = builder.get(p_i, 4);
1015-
10161024
let t0: Ext<C::F, C::EF> = builder.eval(self.constants[11] * p_i_0 * d0.inverse());
10171025
let t1: Ext<C::F, C::EF> = builder.eval(self.constants[9] * p_i_1 * d1.inverse());
10181026
let t2: Ext<C::F, C::EF> = builder.eval(self.constants[10] * p_i_2 * d2.inverse());

0 commit comments

Comments
 (0)