Commit Graph

440 Commits

Author SHA1 Message Date
chriseth
a3d9f38682 Implement Neg for FieldElement. (#2252) 2024-12-18 12:44:18 +00:00
taikoon
1a9c99d232 chore: remove duplicate words (#2227) 2024-12-18 12:14:36 +00:00
Georg Wiese
e2131f501f Block machine processor (#2226)
This PR adds a basic block machine processor. Currently, we assume a
rectangular block shape and just iterate over all rows and identities of
the block until no more progress is made. This is sufficient to generate
code for Poseidon.
2024-12-17 13:31:03 +00:00
chriseth
a68a20c9a4 Effects to rust (#2229)
Formats a vector of "effects" coming from the witgen solver into rust
code, compiles and loads it.

Submachine calls and receiving arguments will be done in another PR.

This code assumes `known` to be a padded bit vector ( #2230 ).

---------

Co-authored-by: Georg Wiese <georgwiese@gmail.com>
2024-12-17 10:41:04 +00:00
Georg Wiese
d007b8f145 Prepare block machine processor (#2231)
A few preparations for #2226:
- Extracted a `test_utils` module
- Introduced a new `Variable` type, which can refer to either a cell or
a "parameter" (either input or output of a machine call). I think in the
future, we could have more variants (e.g. scalar publics). `Variable` is
now used instead of `Cell` in `WitgenInference`.
- `WitgenInference::process_identity` now also returns whether any
progress has been made.
- Renamed `lookup` -> `machine_call` when rendering `Effect`s
2024-12-16 13:53:10 +00:00
chriseth
e5f9392010 Use padded bitvec. (#2230) 2024-12-16 10:49:30 +00:00
chriseth
12aca0e136 Various preparatory changes. (#2228) 2024-12-12 17:56:54 +00:00
chriseth
e3c4c858f0 Witgen inference. (#2219)
This PR adds a component that can derive assignments and other code on
identities and multiple rows. It keeps track of which cells in the trace
are already known and which not. The way to access fixed rows is
abstracted because it does not have a concept of an absolute row. While
this might work for block machines with cyclic fixed columns, it does
not work in the general case.

What it does not do:
- have a sequence of which identities to consider on which rows
- a mechanism that determines when it is finished

---------

Co-authored-by: Georg Wiese <georgwiese@gmail.com>
2024-12-12 16:12:30 +00:00
chriseth
2aa7f8388c Prepare to call jit from block machine. (#2098)
This PR performs preliminary preparations in the block machine so that
it will be able to JIT-compile and evaluate lookups into this machine
given a certain combination of "known inputs".

---------

Co-authored-by: Georg Wiese <georgwiese@gmail.com>
2024-12-12 11:58:23 +00:00
chriseth
598352a23d Expressions and solving routines. (#2212)
This module is an equivalent of the existing affine_expression.rs, but
for compile-time execution on symbolic values instead of run-time
execution on concrete values.

Using the operators defined on that that type, you can build a
SymbolicAffineExpression from a polynomial identity and then use
`.solve()` to try to solve for one unknown variable. The result (instead
of a concrete assignment as in affine_expression.rs) is a
SymbolicExpression, i.e. a complex expression involving variables
(assumed to have a concrete value known at run time), constants and
certain operators on them.

The idea is that SymbolicAffineExpression is used on polynomial
identities in turn and solving for one cell after the other in the
trace. The resulting SymbolicExpression can be translated to rust or
pil.
2024-12-11 17:06:18 +00:00
Georg Wiese
0180542559 Refactorings around process_lookup_direct (#2209)
This PR refactors a few things:
- `process_lookup_direct` no longer has a default implementation.
Eventually, we want all machines to implement it, so I figured it would
be better to explicitly panic in each machine.
- Refactored the implementation of
`FixedLookupMachine::process_plookup`, pulling some stuff out into a new
`CallerData` struct. This is similar to what @chriseth has done on
[`call_jit_from_block`](https://github.com/powdr-labs/powdr/compare/main...call_jit_from_block),
see the comment below.
- As a first test, I implemented `process_lookup_direct` for the
"large"-field memory machine (and `process_plookup` by wrapping
`process_lookup_direct`)
2024-12-10 16:44:15 +00:00
Georg Wiese
e286da46f7 Bus: Remove acc_next + materialize folded tuple (#2201)
This PR:
- Removes the `acc_next` columns, which were only needed because of a
limitation of prover functions. The prover function that existed is now
removed entirely, because we use the hand written witgen anyway, see
#2191.
- Also this PR materializes the folded tuple. This lowers the degree of
the constraints if the tuples being sent have a degree > 1. It also
enables next references in the tuple being sent.

As a result, we can now generate Plonky3 proofs with a bus!

```bash
cargo run -r --features plonky3 --bin powdr-rs compile riscv/tests/riscv_data/keccak -o output --max-degree-log 18 --field gl
cargo run -r --features plonky3 pil output/keccak.asm -o output -f --field gl --prove-with plonky3 --linker-mode bus
```

The proof generation takes 8.32s (of which 394ms are spent on generating
the second-stage witness). This compares to 2.07s proof time without a
bus.
2024-12-09 18:12:33 +00:00
Thibaut Schaeffer
576bdd714d Disallow iteration over hash types (#2167)
Iterating over hash types introduces non-determinism.
Ban generally and require turning off the lint locally when it's fine to
do so.
This
[lint](https://rust-lang.github.io/rust-clippy/master/index.html#/iter_over_hash_type)
only applies to loops.
2024-12-09 15:47:54 +00:00
Thibaut Schaeffer
ad858a1d7d Run cargo bench in PR CI tests and report result to PR and Github Pages (#2198)
Run benchmarks in PRs, fail and warn on the PR if we got more than 20%
slower, add benchmark results to https://docs.powdr.org/dev/bench/
2024-12-09 14:51:20 +00:00
Georg Wiese
ee7cf29c8e Implement process_lookup_direct for KnownMachine & change interface slightly (#2206)
Extracted out of #2071
2024-12-09 13:58:02 +00:00
Georg Wiese
dbc53c76a6 Hand-written bus witness generation (#2191)
Builds on #2194 and #2183.

This PR gives us (relatively) fast witness generation for the bus, by
writing custom code instead of relying on the generic solver + prover
functions:
```
$ cargo run -r --features plonky3 --bin powdr-rs compile riscv/tests/riscv_data/keccak-o output --max-degree-log 18 --field gl
$ cargo run -r --features plonky3 pil output/$TEST.asm -o output -f --field gl --prove-with mock --linker-mode bus
...
Running main machine for 262144 rows
[00:00:05 (ETA: 00:00:05)] █████████░░░░░░░░░░░ 48% - 24283 rows/s, 3169k identities/s, 92% progress                                    
Found loop with period 1 starting at row 127900
[00:00:05 (ETA: 00:00:00)] ████████████████████ 100% - 151125 rows/s, 16170k identities/s, 100% progress                                
Witness generation took 5.748081s
Writing output/commits.bin.
Backend setup for mock...
Setup took 0.54769236s
Generating later-stage witnesses took 0.29s
Proof generation took 2.0383847s
```

On `main`, second-stage witgen for the main machine alone takes about 5
minutes.
2024-12-09 13:35:23 +00:00
Georg Wiese
8a3e33e07c Add a simpler ExpressionEvaluator (#2194)
This PR:
- Renames the current `executor::witgen::ExpressionEvaluator` to
`executor::witgen::evaluators::partial_expression_evaluator::PartialExpressionEvaluator`
- It is used when solving and evaluates to a
`AffineResult<AlgebraicVariable<'a>, T>`, which might still contain
unknown variables.
- Adds a new `ExpressionEvaluator` that simply evaluates to `T`
- Changes `MockBackend` to use the new `ExpressionEvaluator` (previously
wrapped what is now called the `PartialExpressionEvaluator`)

As a result, the code in `MockBackend` can be simplified. Also, I'm
building on this in #2191 for fast witness generation for the bus.
2024-12-09 11:33:42 +00:00
chriseth
f1a0c1feed Paged memory (#2205)
Change memory machine to use pages instead of a "flat" map.
2024-12-09 10:51:42 +00:00
Georg Wiese
3b45173c4b Add PhantomBusInteraction (#2183)
This PR adds a `Constr:: PhantomBusInteraction` variant. For now, it is
ignored - if users want to use a bus, they need to express this in terms
of phantom lookups / permutations as before this PR.

I added a few `TODO(bus_interaction)` and opened #2184 to track support
for phantom bus interactions.

One use-case this could have before though is to trigger a
"hand-written" witness generation for the bus, as discussed in the chat.
2024-12-06 17:21:42 +00:00
Georg Wiese
4c5caae8f6 Better error message if things go wrong in machine extraction (#2142)
I tried to debug why the RISC-V machine doesn't work with `--linker-mode
bus` yet, and this adds helpful error messages.
2024-12-04 11:24:10 +00:00
Leo
f11cf21a11 Revert "Parallelize calls to prover functions (#2176)" (#2188)
This reverts commit d980c68f89 from
https://github.com/powdr-labs/powdr/pull/2176
2024-12-03 10:17:54 +00:00
Georg Wiese
2832ff108b Fix second stage witgen (#2173)
Builds on #2169

With this PR, second-stage witness generation works for the bus used in
the RISC-V machine 🎉

This is an end-to-end test:
```bash
cargo run -r --bin powdr-rs compile riscv/tests/riscv_data/sum-o output --max-degree-log 15 --field gl
cargo run -r pil output/sum.asm -o output -f --field gl --prove-with mock --linker-mode bus -i 1,1,1
```

What's needed is two small changes to `VmProcessor`:
- The degree is now passed by the caller (`DynamicMachine` or
`SecondStageMachine`). That way, `SecondStageMachine` can set it to the
actual final size, instead of the maximum allowed degree.
- I disabled loop detection for second-stage witness generation for now.
2024-11-29 18:16:02 +00:00
Georg Wiese
d980c68f89 Parallelize calls to prover functions (#2176)
Cherry-picked from #2174

With this PR, we run all prover functions in parallel when solving for
the witness in `VmProcessor`. Interestingly, this didn't require any
changes to the order in which things are done: We already ran the
functions independently and applied the combined updates. So, this is a
classic map-reduce.

I think this change always makes sense, but is especially useful for the
prover functions we have to set bus accumulator values. For example, in
our RISC-V machine, the main machine has ~30 bus interactions, with a
fairly expensive prover function for each.

When used on top of #2173 and #2175, this accelerates second-stage
witness generation for the main machine from ~10s to ~6s for the example
mentioned in #2173.
2024-11-29 17:14:33 +00:00
Georg Wiese
6530820ae8 Introduce SecondStageMachine (#2169)
This introduces a new machine which is always used for the second-stage
witness generation. Currently it is a copy of DynamicMachine, but in the
end it will be optimized for second-stage witness generation.
2024-11-29 16:42:19 +00:00
Thibaut Schaeffer
c0fefae3e7 Introduce workspace-level lints (#2166)
Reduce the cost of adding a lint from O(#workspace_crates) to 1.
2024-11-29 14:02:53 +00:00
Georg Wiese
0d67ef1d21 Improve error messages for connection errors in MockBackend (#2153)
With this PR, we get much better error messages for connection errors.

This is an example of an issue we're currently debugging:
```
$ cargo run -r pil test_data/std/keccakf16_memory_test.asm -o output -f --prove-with mock --export-witness-csv
...
Errors in 50 / 213 connections:
Connection failed between main_keccakf16_memory and main_memory:
    main_keccakf16_memory::sel[0] * main_keccakf16_memory::step_flags[0] $ [0, main_keccakf16_memory::input_addr_h, main_keccakf16_memory::input_addr_l, main_keccakf16_memory::time_step, main_keccakf16_memory::preimage[3], main_keccakf16_memory::preimage[2]] is main_memory::selectors[2] $ [main_memory::m_is_write, main_memory::m_addr_high, main_memory::m_addr_low, main_memory::m_step_high * 65536 + main_memory::m_step_low, main_memory::m_value1, main_memory::m_value2];
  The following tuples appear in main_memory, but not in main_keccakf16_memory:
    Row 24: (0, 0, 0, 32, 0, 0)

Connection failed between main_keccakf16_memory and main_memory:
    main_keccakf16_memory::sel[0] * main_keccakf16_memory::step_flags[0] $ [0, main_keccakf16_memory::addr_h[0], main_keccakf16_memory::addr_l[0], main_keccakf16_memory::time_step, main_keccakf16_memory::preimage[1], main_keccakf16_memory::preimage[0]] is main_memory::selectors[3] $ [main_memory::m_is_write, main_memory::m_addr_high, main_memory::m_addr_low, main_memory::m_step_high * 65536 + main_memory::m_step_low, main_memory::m_value1, main_memory::m_value2];
  The following tuples appear in main_memory, but not in main_keccakf16_memory:
    Row 24: (0, 0, 4, 32, 0, 0)

Connection failed between main_keccakf16_memory and main_memory:
    main_keccakf16_memory::sel[0] * main_keccakf16_memory::step_flags[0] $ [0, main_keccakf16_memory::addr_h[1], main_keccakf16_memory::addr_l[1], main_keccakf16_memory::time_step, main_keccakf16_memory::preimage[7], main_keccakf16_memory::preimage[6]] is main_memory::selectors[4] $ [main_memory::m_is_write, main_memory::m_addr_high, main_memory::m_addr_low, main_memory::m_step_high * 65536 + main_memory::m_step_low, main_memory::m_value1, main_memory::m_value2];
  The following tuples appear in main_memory, but not in main_keccakf16_memory:
    Row 24: (0, 0, 8, 32, 0, 0)

Connection failed between main_keccakf16_memory and main_memory:
    main_keccakf16_memory::sel[0] * main_keccakf16_memory::step_flags[0] $ [0, main_keccakf16_memory::addr_h[2], main_keccakf16_memory::addr_l[2], main_keccakf16_memory::time_step, main_keccakf16_memory::preimage[5], main_keccakf16_memory::preimage[4]] is main_memory::selectors[5] $ [main_memory::m_is_write, main_memory::m_addr_high, main_memory::m_addr_low, main_memory::m_step_high * 65536 + main_memory::m_step_low, main_memory::m_value1, main_memory::m_value2];
  The following tuples appear in main_memory, but not in main_keccakf16_memory:
    Row 24: (0, 0, 12, 32, 0, 1)

Connection failed between main_keccakf16_memory and main_memory:
    main_keccakf16_memory::sel[0] * main_keccakf16_memory::step_flags[0] $ [0, main_keccakf16_memory::addr_h[3], main_keccakf16_memory::addr_l[3], main_keccakf16_memory::time_step, main_keccakf16_memory::preimage[11], main_keccakf16_memory::preimage[10]] is main_memory::selectors[6] $ [main_memory::m_is_write, main_memory::m_addr_high, main_memory::m_addr_low, main_memory::m_step_high * 65536 + main_memory::m_step_low, main_memory::m_value1, main_memory::m_value2];
  The following tuples appear in main_memory, but not in main_keccakf16_memory:
    Row 24: (0, 0, 16, 32, 0, 0)

... and 45 more errors

thread 'main' panicked at cli/src/main.rs:727:14:
called `Result::unwrap()` on an `Err` value: ["Constraint check failed"]
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
```
2024-11-27 10:33:24 +00:00
Georg Wiese
51a7349fc1 Fail hard for invalid memory accesses (#2158)
This would have caught #2157.
2024-11-27 08:42:30 +00:00
Georg Wiese
43061cf17b Bug fix: Fix intermediates cache for next references (#2151)
Fixes a bug in witgen & the Plonky3 backend regarding caching of values
of intermediate columns: We ignored the next operator.
2024-11-26 14:40:12 +00:00
Georg Wiese
99532a6105 Compute later-stage witness by machine (#2122)
With this PR, we compute the later-stage witnesses per machine instead
of globally. This has two advantages:
- We're able to handle machines of different sizes
- We can parallelize later-stage witness generation

This affects the two backend that can deal with multiple machines in the
first place: `Plonky3Backend` and `CompositeBackend`
2024-11-26 14:29:51 +00:00
Georg Wiese
132dc100b8 FixedData::polynomial_references: Cache results for intermediate columns (#2149)
Fixes a performance issue with intermediate polynomials.
2024-11-26 10:39:57 +00:00
Georg Wiese
99d9dd0fc4 WriteOnceMemory: Generate multiplicity column (#2148)
Instances of `WriteOnceMemory` did not yet generate the multiplicity
column when connected via a phantom lookup.
2024-11-26 08:52:11 +00:00
Georg Wiese
34f765d9e8 Remove range constraint multiplicity columns from main machine (#2147)
Multiplicity columns of *global* range constraints used to end up in the
main machine, which is a problem if it has a length different from the
range check machine.
2024-11-26 08:51:54 +00:00
chriseth
2a3f989c12 Move vm processor (#2136)
Co-authored-by: Georg Wiese <georgwiese@gmail.com>
2024-11-26 07:07:51 +00:00
Georg Wiese
cd07dfb660 Filter later-stage witnesses and identities (#2129)
Prepares #2129

With this PR, later-stage witness columns & identities referencing them
(or later-stage challenges) are completely ignored. The columns are not
assigned to any machine. Previously, they would end up in the main
machine and never receive any updates. That doesn't work if machines
have different sized though.

---------

Co-authored-by: Thibaut Schaeffer <schaeffer.thibaut@gmail.com>
2024-11-25 15:20:42 +00:00
chriseth
81517d0294 Remove 'b lifetime. (#2135) 2024-11-23 13:20:25 +00:00
chriseth
81196aea3e Improve MutableState / Machines (#2130)
MutableState is the main way to get access to sub-machines during
witness generation. We used to create copies of MutableState for each
lookup, extracting the "current machine" where we need mutable access
and creating copies of references to the other machines. This causes an
allocation for each lookup (including fixed lookups, I think) which is
bad for performance.

This PR changes the approach to use RefCell instead: MutableState now
owns the machines and for each call to a machine, we mutably borrow that
machine. The RefCell mechanism ensures that there are no recursive calls
to machines and also avoids allocations.

I also changed the query callback to use non-mut references.

The first and third commits only move code around.
2024-11-22 17:28:03 +00:00
Leo
51cff4c758 remove powdr-executor dependency from backend-utils and plonky3 (#2124)
To make the plonky3 verifier module simpler for recursion
2024-11-21 13:57:13 +00:00
Georg Wiese
8b38138559 Fix failing assertion in witgen (#2120)
When writing #2119, I came across another issue in witgen. When running
this file on `main`:

```rs
namespace main(4);

    // Two bit-constrained witness columns
    // In practice, bit1 is always one (but this is not constrained)
    col witness bit1(i) query Query::Hint(1);
    col witness bit2;
    bit1 * (bit1 - 1) = 0;
    bit2 * (bit2 - 1) = 0;

    // Constrain their sum to be binary as well.
    // This ensures that at most one of the two bits is set.
    // Therefore, bit2 is always zero.
    let bit_sum;
    bit_sum = bit1 + bit2;
    bit_sum * (bit_sum - 1) = 0;

    // Some witness that depends on bit2.
    col witness foo;
    foo = bit2 * 42 + (1 - bit2) * 43;
```

I'm getting
```
thread 'main' panicked at /Users/georg/coding/powdr/executor/src/witgen/global_constraints.rs:258:17:
assertion failed: known_constraints.insert(p, RangeConstraint::from_max_bit(0)).is_none()
```

This is because when it sees the binary range constraint `bit_sum *
(bit_sum - 1) = 0`, it already figured out that `bit_sum` can be at most
`1` because of `bit_sum = bit1 + bit2`.

This PR fixes it.
2024-11-20 06:44:01 +00:00
Georg Wiese
e009331905 Add MockBackend (#2114)
Adds a basic mock prover that simply asserts that all constraints are
satisfied.

This first version has the following features:
- Polynomial constraints are verified.
- Speed is reasonable. For example, the RISC-V Keccak example is
verified in 0.087s.
- Error messages are good: It prints the relevant constraint and row,
and all relevant assignments.

Missing features:
- Machine connections (i.e., any lookups or permutations) are not yet
validated.
- Later-stage witnesses are not yet validated.

Caveats:
- We rely on `powdr_backend_utils::split_pil`, so lookups / permutations
*within* a namespace are ignored.

Example:
```
$ cargo run pil test_data/pil/fibonacci.pil -o output -f --prove-with mock
```
2024-11-19 20:46:46 +00:00
Georg Wiese
d91ae4f90a Bug fix in ProcessingSequenceIterator (#2117)
Fixes a bug I encountered in #2109:
- For blog machines, we have a cache which tracks a sequence of solving
steps that led to a success in the past.
- However, the needed sequence could be different from call to call. In
particular, it could depend on the operation ID.
- Because of that, in #1562, we added that the "default" sequence
iterator is always run after the cached sequence.
- But, we never called `report_progress()` on the default iterator,
which led to a bug in #2109.
2024-11-19 20:09:18 +00:00
Georg Wiese
efbcd1ffe2 Witgen: Handle intermediate polynomials (#2007)
Completes a task in #2009.

With this PR, we no longer rely on
`Analyzed::identities_with_inlined_intermediate_polynomials()`, which
can produce exponentially large expressions in some cases. Instead,
intermediate polynomials are evaluated on demand and cached. Thibaut's
example from #1995 speeds up massively with this PR.
2024-11-19 10:19:31 +00:00
Georg Wiese
2c1acf8b09 Block Machine: Handle case where number of rows is just enough (#2070)
Before this PR, we used to panic if the number of rows in a block
machine was just enough to fit the needed number of blocks. This PR
fixes it.
2024-11-18 13:29:24 +00:00
Georg Wiese
016fb2a9fd Refactor MachineExtractor (#2099)
Pulled out of #2007, to keep the diff smaller (and more relevant).

This refactoring simply builds a `MachineExtractor` object that holds a
`&FixedData`.

Review with the "Hide whitespace" setting :)
2024-11-15 17:19:47 +00:00
chriseth
e64721c3f9 Use contiguous data for finalized rows. (#2088)
Change FinalizableData so that finalized rows are stored as one
contiguous array instead of an array of arrays. Furthermore, if the
column IDs are a contiguous sequence, the row will only have as many
field elements as there are columns.

I don't expect this PR to improve performance, but we can directly
re-use this data structure for JIT-compiled executors (which need
contiguous cell data, it was one of the main performance boosts). This
means we can decide at runtime if we want to use a JIT-compiled executor
or the interpreted one.

And this in turn allows us to delay the actual JIT-compiling until we
get a request to the machine in the form of a bit field of known columns
in the lookup. And once we know which columns are known, we can try to
JIT-compile. If it fails, we store that this combination failed and will
only use the interpreted one on that one in the future. This is
especially useful for things like poseidon_gl, where we don't want to
try all `2^13` combinations...
2024-11-15 17:13:10 +00:00
Georg Wiese
ed6e4f7671 Remove empty machines (#2078)
With this PR, if a block machine never receives a call *and* has dynamic
size, it is skipped entirely in the proof (for all backends that support
dynamically-sized machines, Plonky3 and the Composite backend). This is
sound if we treat a missing machine as not interacting at all with the
bus.

As a result, we can remove the "dummy calls" in the RISC-V machine,
which ensure that each block machine is called at least once.

In slightly more detail:
- If a block machine never receives a call, witgen returns columns of
length 0.
- When proving, we detect that and remove the machine entirely.
- The verifier is relaxed in that it no longer asserts that all machines
are being proven. As mentioned, this assumes that the bus argument
(which is not fully implemented) handles this accordingly, using a bus
accumulator of zero for the missing machine.

To test:
```
$ cargo run pil test_data/asm/block_to_block_empty_submachine.asm -o output -f --export-witness-csv --prove-with plonky3
...
Running main machine for 8 rows
[00:00:00 (ETA: 00:00:00)] ████████████████████ 100% - Starting...                                                     
Machine Secondary machine 0: main_arith (BlockMachine) is never used at runtime, so we remove it.
Witness generation took 0.002950166s
Writing output/commits.bin.
Writing output/block_to_block_empty_submachine_witness.csv.
Backend setup for plonky3...
Setup took 0.023712292s
Proof generation took 0.083828546s
Proof size: 80517 bytes
Writing output/block_to_block_empty_submachine_proof.bin.
```
2024-11-14 17:09:46 +00:00
chriseth
2c9924d2b4 Extract some functions from split_out_machines. (#2085)
A pure refactoring PR that tries to simplify split_out_machines with the
goal of being able to JIT-compile at least some machines.
2024-11-13 16:35:19 +00:00
Georg Wiese
0913624861 Improve constant evaluation logging (#2083)
I noticed that constant evaluation takes a very long time. With this
logging, it is easier to see why, e.g. for the Rust Keccak example:
```
  Generated values for main_poseidon_gl::CLK[0] (32..4194304) in 5.11s
  Generated values for main_poseidon_gl::CLK[1] (32..4194304) in 5.77s
  Generated values for main_poseidon_gl::CLK[2] (32..4194304) in 5.39s
  Generated values for main_poseidon_gl::CLK[3] (32..4194304) in 5.12s
  Generated values for main_poseidon_gl::CLK[4] (32..4194304) in 6.32s
  Generated values for main_poseidon_gl::CLK[5] (32..4194304) in 6.25s
  Generated values for main_poseidon_gl::CLK[6] (32..4194304) in 4.92s
  Generated values for main_poseidon_gl::CLK[7] (32..4194304) in 5.48s
  Generated values for main_poseidon_gl::CLK[8] (32..4194304) in 5.39s
  Generated values for main_poseidon_gl::CLK[9] (32..4194304) in 5.85s
  Generated values for main_poseidon_gl::CLK[10] (32..4194304) in 5.84s
  Generated values for main_poseidon_gl::CLK[11] (32..4194304) in 5.23s
  Generated values for main_poseidon_gl::CLK[12] (32..4194304) in 6.04s
  Generated values for main_poseidon_gl::CLK[13] (32..4194304) in 6.08s
  Generated values for main_poseidon_gl::CLK[14] (32..4194304) in 4.88s
  Generated values for main_poseidon_gl::CLK[15] (32..4194304) in 5.93s
  Generated values for main_poseidon_gl::LASTBLOCK (32..4194304) in 12.95s
Fixed column generation took 108.75529s
```
2024-11-13 15:42:25 +00:00
chriseth
ff054afd45 Remove redundant function. (#2068) 2024-11-11 20:51:52 +00:00
chriseth
83c5894282 Extract analysis utils. (#2067) 2024-11-11 14:56:39 +00:00
chriseth
ab1f43a1e2 Introduce direct lookup. (#2063)
This PR introduces a more "direct" way to perform a lookup during
witness generation. It removes the concept of `EvalValue`, which is a
list of "updates", and instead requests the called machine to directly
fill in mutable pointers to field elements.

The goal is to use this (hopefully) faster interface if
 - the lookup can be fully solved in a single call
 - no cell-based range constraints are needed

If the LHS of the lookup consists of direct polynomial references (or
next references), the caller can pass a pointer to the final table and
does not need to move data around any further.

Some numbers:

For the "keccak test", and only looking at the PC lookup, we get:

Inside `process_plookup_internal`:

40 ns: preparing the `data` and `values` arrays
290 ns: call to process_lookup_direct
1300 ns: computing the result EvalValue.
2024-11-11 14:35:19 +00:00