From 2671e4624ffe039175a4586549382be67f5985ba Mon Sep 17 00:00:00 2001 From: John Guibas Date: Mon, 8 Apr 2024 23:42:53 -0700 Subject: [PATCH] for loop optimizations --- examples/fibonacci-io/script/src/main.rs | 2 +- examples/fibonacci/program/Cargo.lock | 14 +---- .../program/elf/riscv32im-succinct-zkvm-elf | Bin 86124 -> 102152 bytes recursion/compiler/src/asm/compiler.rs | 34 +++++++++--- recursion/compiler/src/asm/instruction.rs | 49 ++++++++++++++++++ recursion/compiler/src/ir/builder.rs | 7 +-- recursion/compiler/src/ir/collections.rs | 23 ++++++++ recursion/compiler/tests/for_loops.rs | 28 ++++++++++ recursion/core/src/runtime/mod.rs | 9 ++++ recursion/core/src/runtime/opcode.rs | 1 + recursion/program/src/fri/mod.rs | 16 +++--- recursion/program/src/fri/two_adic_pcs.rs | 14 ++--- 12 files changed, 161 insertions(+), 36 deletions(-) diff --git a/examples/fibonacci-io/script/src/main.rs b/examples/fibonacci-io/script/src/main.rs index ef4b9803a5..72d377ebe8 100644 --- a/examples/fibonacci-io/script/src/main.rs +++ b/examples/fibonacci-io/script/src/main.rs @@ -35,7 +35,7 @@ fn main() { println!("b: {}", b); // Verify proof and public values - SP1Verifier::verify(ELF, &proof).expect("verification failed"); + SP1Verifier::verify(ELF, &proof).expect("verification failed"s); let mut pv_hasher = Sha256::new(); pv_hasher.update(n.to_le_bytes()); diff --git a/examples/fibonacci/program/Cargo.lock b/examples/fibonacci/program/Cargo.lock index 5be5074d04..395fc3fde0 100644 --- a/examples/fibonacci/program/Cargo.lock +++ b/examples/fibonacci/program/Cargo.lock @@ -347,7 +347,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "once_cell", - "sha2 0.10.8 (registry+https://github.com/rust-lang/crates.io-index)", + "sha2", "signature", ] @@ -535,16 +535,6 @@ dependencies = [ "digest", ] -[[package]] -name = "sha2" -version = "0.10.8" -source = "git+https://github.com/sp1-patches/RustCrypto-hashes.git?branch=patch-v0.10.8#3d692aa90b91513886d757d01f8fc2d51c0ec0d7" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - [[package]] name = "signature" version = "2.2.0" @@ -588,7 +578,7 @@ dependencies = [ "once_cell", "rand", "serde", - "sha2 0.10.8 (git+https://github.com/sp1-patches/RustCrypto-hashes.git?branch=patch-v0.10.8)", + "sha2", "sp1-precompiles", ] diff --git a/examples/fibonacci/program/elf/riscv32im-succinct-zkvm-elf b/examples/fibonacci/program/elf/riscv32im-succinct-zkvm-elf index bb9b2b657d9ddae69e25df1498970107b8586ae7..406a930e4e23010afea65cd34761058110dfcd23 100755 GIT binary patch delta 38669 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 delta 22214 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 + TwoAdicField> let loop_label = self.compiler.block_label(); // The loop body. f(self.loop_var, self.compiler); - // Increment the loop variable. - self.compiler.push(AsmInstruction::ADDI( - self.loop_var.fp(), - self.loop_var.fp(), - self.step_size, - )); + + if self.step_size == F::one() { + self.jump_to_loop_body_inc(loop_label); + } else { + // Increment the loop variable. + self.compiler.push(AsmInstruction::ADDI( + self.loop_var.fp(), + self.loop_var.fp(), + self.step_size, + )); + } // Add a basic block for the loop condition. self.compiler.basic_block(); @@ -815,4 +820,21 @@ impl<'a, F: PrimeField32 + TwoAdicField, EF: ExtensionField + TwoAdicField> } } } + + fn jump_to_loop_body_inc(&mut self, loop_label: F) { + match self.end { + Usize::Const(end) => { + let instr = AsmInstruction::BNEIINC( + loop_label, + self.loop_var.fp(), + F::from_canonical_usize(end), + ); + self.compiler.push(instr); + } + Usize::Var(end) => { + let instr = AsmInstruction::BNEINC(loop_label, self.loop_var.fp(), end.fp()); + self.compiler.push(instr); + } + } + } } diff --git a/recursion/compiler/src/asm/instruction.rs b/recursion/compiler/src/asm/instruction.rs index 66c1fd36fa..7f618d50e0 100644 --- a/recursion/compiler/src/asm/instruction.rs +++ b/recursion/compiler/src/asm/instruction.rs @@ -113,8 +113,11 @@ pub enum AsmInstruction { JALR(i32, i32, i32), /// Branch not equal BNE(F, i32, i32), + /// Branch not equal increment c by 1. + BNEINC(F, i32, i32), /// Branch not equal immediate BNEI(F, i32, F), + BNEIINC(F, i32, F), /// Branch equal BEQ(F, i32, i32), /// Branch equal immediate @@ -683,6 +686,20 @@ impl> AsmInstruction { true, ) } + AsmInstruction::BNEINC(label, lhs, rhs) => { + let offset = + F::from_canonical_usize(label_to_pc[&label]) - F::from_canonical_usize(pc); + Instruction::new( + Opcode::BNEINC, + i32_f(lhs), + i32_f_arr(rhs), + f_u32(offset), + F::zero(), + F::zero(), + false, + true, + ) + } AsmInstruction::BNEI(label, lhs, rhs) => { let offset = F::from_canonical_usize(label_to_pc[&label]) - F::from_canonical_usize(pc); @@ -697,6 +714,20 @@ impl> AsmInstruction { true, ) } + AsmInstruction::BNEIINC(label, lhs, rhs) => { + let offset = + F::from_canonical_usize(label_to_pc[&label]) - F::from_canonical_usize(pc); + Instruction::new( + Opcode::BNEINC, + i32_f(lhs), + f_u32(rhs), + f_u32(offset), + F::zero(), + F::zero(), + true, + true, + ) + } AsmInstruction::EBNE(label, lhs, rhs) => { let offset = F::from_canonical_usize(label_to_pc[&label]) - F::from_canonical_usize(pc); @@ -1100,6 +1131,24 @@ impl> AsmInstruction { rhs ) } + AsmInstruction::BNEINC(label, lhs, rhs) => { + write!( + f, + "bneinc {}, ({})fp, {}", + labels.get(label).unwrap_or(&format!(".L{}", label)), + lhs, + rhs + ) + } + AsmInstruction::BNEIINC(label, lhs, rhs) => { + write!( + f, + "bneiinc {}, ({})fp, {}", + labels.get(label).unwrap_or(&format!(".L{}", label)), + lhs, + rhs + ) + } AsmInstruction::BEQ(label, lhs, rhs) => { write!( f, diff --git a/recursion/compiler/src/ir/builder.rs b/recursion/compiler/src/ir/builder.rs index 59aef594c3..61d254e8c1 100644 --- a/recursion/compiler/src/ir/builder.rs +++ b/recursion/compiler/src/ir/builder.rs @@ -401,7 +401,7 @@ impl Builder { builder.range(0, HASH_RATE).for_each(|j, builder| { let index: Var<_> = builder.eval(i + j); let element = builder.get(array, index); - builder.set(&mut state, j, element); + builder.set_value(&mut state, j, element); builder.if_eq(index, last_index).then(|builder| { builder.assign(break_flag, C::N::one()); builder.break_loop(); @@ -481,11 +481,12 @@ impl Builder { self.range(0, bit_len).for_each(|i, builder| { let index: Var = builder.eval(bit_len - i - C::N::one()); let entry = builder.get(index_bits, index); - builder.set(&mut result_bits, i, entry); + builder.set_value(&mut result_bits, i, entry); }); + let zero = self.eval(C::N::zero()); self.range(bit_len, NUM_BITS).for_each(|i, builder| { - builder.set(&mut result_bits, i, C::N::zero()); + builder.set_value(&mut result_bits, i, zero); }); result_bits diff --git a/recursion/compiler/src/ir/collections.rs b/recursion/compiler/src/ir/collections.rs index 74934b71e8..d434a563aa 100644 --- a/recursion/compiler/src/ir/collections.rs +++ b/recursion/compiler/src/ir/collections.rs @@ -186,6 +186,29 @@ impl Builder { } } } + + pub fn set_value, I: Into>>( + &mut self, + slice: &mut Array, + index: I, + value: V, + ) { + let index = index.into(); + + match slice { + Array::Fixed(_) => { + todo!() + } + Array::Dyn(ptr, _) => { + let index = MemIndex { + index, + offset: 0, + size: V::size_of(), + }; + self.store(*ptr, index, value); + } + } + } } impl> Variable for Array { diff --git a/recursion/compiler/tests/for_loops.rs b/recursion/compiler/tests/for_loops.rs index 1af176dedf..eab66f0f12 100644 --- a/recursion/compiler/tests/for_loops.rs +++ b/recursion/compiler/tests/for_loops.rs @@ -197,3 +197,31 @@ fn test_compiler_step_by() { let mut runtime = Runtime::::new(&program, config.perm.clone()); runtime.run(); } + +#[test] +fn test_compiler_bneinc() { + type SC = BabyBearPoseidon2; + type F = ::Val; + type EF = ::Challenge; + let mut builder = VmBuilder::::default(); + + let n_val = BabyBear::from_canonical_u32(20); + + let zero: Var<_> = builder.eval(F::zero()); + let n: Var<_> = builder.eval(n_val); + + let i_counter: Var<_> = builder.eval(F::zero()); + builder.range(zero, n).step_by(1).for_each(|_, builder| { + builder.assign(i_counter, i_counter + F::one()); + }); + + let code = builder.clone().compile_to_asm(); + + println!("{}", code); + + let program = builder.compile(); + + let config = SC::default(); + let mut runtime = Runtime::::new(&program, config.perm.clone()); + runtime.run(); +} diff --git a/recursion/core/src/runtime/mod.rs b/recursion/core/src/runtime/mod.rs index 9994ff4f85..ce07247ecc 100644 --- a/recursion/core/src/runtime/mod.rs +++ b/recursion/core/src/runtime/mod.rs @@ -466,6 +466,15 @@ where next_pc = self.pc + c_offset; } } + Opcode::BNEINC => { + let (mut a_val, b_val, c_offset) = self.branch_rr(&instruction); + a_val.0[0] += F::one(); + if a_val.0[0] != b_val.0[0] { + next_pc = self.pc + c_offset; + } + self.mw(self.fp + instruction.op_a, a_val, MemoryAccessPosition::A); + (a, b, c) = (a_val, b_val, Block::from(c_offset)); + } Opcode::EBEQ => { let (a_val, b_val, c_offset) = self.branch_rr(&instruction); (a, b, c) = (a_val, b_val, Block::from(c_offset)); diff --git a/recursion/core/src/runtime/opcode.rs b/recursion/core/src/runtime/opcode.rs index 73d3319e94..23cfe9dddd 100644 --- a/recursion/core/src/runtime/opcode.rs +++ b/recursion/core/src/runtime/opcode.rs @@ -56,6 +56,7 @@ pub enum Opcode { HintLen = 37, Hint = 38, Poseidon2Compress = 39, + BNEINC = 40, } impl Opcode { diff --git a/recursion/program/src/fri/mod.rs b/recursion/program/src/fri/mod.rs index 3a64653020..4b3be08c3c 100644 --- a/recursion/program/src/fri/mod.rs +++ b/recursion/program/src/fri/mod.rs @@ -168,19 +168,19 @@ where let index_pair = index_bits.shift(builder, i_plus_one); let mut evals: Array> = builder.array(2); - builder.set(&mut evals, 0, folded_eval); - builder.set(&mut evals, 1, folded_eval); - builder.set(&mut evals, index_sibling_mod_2, step.sibling_value); + builder.set_value(&mut evals, 0, folded_eval); + builder.set_value(&mut evals, 1, folded_eval); + builder.set_value(&mut evals, index_sibling_mod_2, step.sibling_value); let two: Var = builder.eval(C::N::from_canonical_u32(2)); let dims = DimensionsVariable:: { height: builder.exp(two, log_folded_height), }; let mut dims_slice: Array> = builder.array(1); - builder.set(&mut dims_slice, 0, dims); + builder.set_value(&mut dims_slice, 0, dims); let mut opened_values = builder.array(1); - builder.set(&mut opened_values, 0, evals.clone()); + builder.set_value(&mut opened_values, 0, evals.clone()); verify_batch::( builder, &commit, @@ -192,8 +192,8 @@ where let mut xs: Array> = builder.array(2); let two_adic_generator_one = config.get_two_adic_generator(builder, Usize::Const(1)); - builder.set(&mut xs, 0, x); - builder.set(&mut xs, 1, x); + builder.set_value(&mut xs, 0, x); + builder.set_value(&mut xs, 1, x); builder.set(&mut xs, index_sibling_mod_2, x * two_adic_generator_one); let xs_0 = builder.get(&xs, 0); @@ -306,7 +306,7 @@ pub fn reduce( let opened_value_flat = builder.ext2felt(opened_value); for k in 0..D { let base = builder.get(&opened_value_flat, k); - builder.set(&mut flattened_opened_values, nb_opened_values, base); + builder.set_value(&mut flattened_opened_values, nb_opened_values, base); builder.assign(nb_opened_values, nb_opened_values + C::N::one()); } }); diff --git a/recursion/program/src/fri/two_adic_pcs.rs b/recursion/program/src/fri/two_adic_pcs.rs index 0747f9c0d1..6699376a34 100644 --- a/recursion/program/src/fri/two_adic_pcs.rs +++ b/recursion/program/src/fri/two_adic_pcs.rs @@ -55,11 +55,13 @@ pub fn verify_two_adic_pcs( let mut ro: Array> = builder.array(32); let mut alpha_pow: Array> = builder.array(32); + let zero_ef = builder.eval(C::EF::zero().cons()); for j in 0..32 { - builder.set(&mut ro, j, C::EF::zero().cons()); + builder.set_value(&mut ro, j, zero_ef); } + let one_ef = builder.eval(C::EF::one().cons()); for j in 0..32 { - builder.set(&mut alpha_pow, j, C::EF::one().cons()); + builder.set_value(&mut alpha_pow, j, one_ef); } builder.range(0, rounds.len()).for_each(|j, builder| { @@ -72,7 +74,7 @@ pub fn verify_two_adic_pcs( builder.range(0, mats.len()).for_each(|k, builder| { let mat = builder.get(&mats, k); let height_log2: Var<_> = builder.eval(mat.domain.log_n + log_blowup); - builder.set(&mut batch_heights_log2, k, height_log2); + builder.set_value(&mut batch_heights_log2, k, height_log2); }); let mut batch_dims: Array> = builder.array(mats.len()); builder.range(0, mats.len()).for_each(|k, builder| { @@ -80,7 +82,7 @@ pub fn verify_two_adic_pcs( let dim = DimensionsVariable:: { height: builder.eval(mat.domain.size() * blowup), }; - builder.set(&mut batch_dims, k, dim); + builder.set_value(&mut batch_dims, k, dim); }); let log_batch_max_height = builder.get(&batch_heights_log2, 0); @@ -136,7 +138,7 @@ pub fn verify_two_adic_pcs( }; let mut input_ptr = builder.array::>(1); - builder.set(&mut input_ptr, 0, input); + builder.set_value(&mut input_ptr, 0, input); builder.range(0, ps_at_z.len()).for_each(|m, builder| { builder.push(DslIR::FriFold(m, input_ptr.clone())); @@ -145,7 +147,7 @@ pub fn verify_two_adic_pcs( }); }); - builder.set(&mut reduced_openings, i, ro); + builder.set_value(&mut reduced_openings, i, ro); }); verify_challenges(