Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] Machines communicating through shared memory #1380

Draft
wants to merge 14 commits into
base: machine_arguments
Choose a base branch
from

Conversation

georgwiese
Copy link
Collaborator

@georgwiese georgwiese commented May 15, 2024

Building on #1356, this PR re-writes some of the std machines to communicate via a shared memory.

To test:

cargo run -r pil test_data/std/poseidon_bn254_test.asm -o output -f --export-csv --field bn254 --prove-with halo2-mock
cargo run -r pil test_data/std/poseidon_gl_test.asm -o output -f --export-csv --prove-with estark-starky
cargo run -r pil test_data/std/arith_test.asm -o output -f --export-csv --field bn254 --prove-with halo2-mock

Next steps:

While the arithmetic machine clearly benefits from this approach, it is less obvious if it is also beneficial for the Poseidon machines. They have fewer arguments to start with, and I needed to add more witness columns (one for each state element, so that the input state is available in all rows) and fixed columns (a clock). The arithmetic machine had all that already anyway.

@georgwiese georgwiese changed the base branch from main to machine_arguments May 15, 2024 13:25
@georgwiese georgwiese changed the title Machines communicating through shared memory [WIP] Machines communicating through shared memory May 16, 2024
github-merge-queue bot pushed a commit that referenced this pull request May 21, 2024
Cherry-picked ef6a72f from #1380.

With this PR, we track whether a call to a machine led to some side
effect (e.g. added a block). In that case, the processed identity should
count has having led to some progress, even if no values were returned
to the calling machine. An example would be writing values to memory,
which does not return any values and hence does not change the state of
the caller.
github-merge-queue bot pushed a commit that referenced this pull request May 28, 2024
*Cherry-picked b1a07bd from #1380, and
extended on it.*

Fixes #1382.

With this PR, a lookup like `selector { byte_lower + 256 * byte_upper }
in { <some other machine> }` works, even if the range constraints on
`byte_lower` and `byte_upper` are not "global". For example, they could
be implemented as `selector { byte_lower } in { BYTES }` (i.e.,
`byte_lower` is only range constrained when the machine call is active).

To make this work, I changed the `Machine::process_plookup` interface
like this:
```diff
    fn process_plookup<'b, Q: QueryCallback<T>>(
        &mut self,
        mutable_state: &'b mut MutableState<'a, 'b, T, Q>,
        identity_id: u64,
-       args: &[AffineExpression<&'a AlgebraicReference, T>],
+       caller_rows: &'b RowPair<'b, 'a, T>,
    ) -> EvalResult<'a, T>;
```

The `RowPair` passed by the caller contains all range constraints known
at runtime. The LHS of the lookup (or permutation) is no longer
evaluated by the caller but by the callee. For this, the callee needs to
remember the identity associated with the `identity_id` (before this PR,
most machines just remembered the RHS, not the full identity). I don't
expect there to be any performance implications, because we only invoke
one machine (since #1154).

### Benchmark results

```
executor-benchmark/keccak
                        time:   [14.609 s 14.645 s 14.678 s]
                        change: [-2.5984% -2.3127% -2.0090%] (p = 0.00 < 0.05)
                        Performance has improved.

executor-benchmark/many_chunks_chunk_0
                        time:   [39.299 s 39.380 s 39.452 s]
                        change: [-3.9505% -3.6909% -3.4063%] (p = 0.00 < 0.05)
                        Performance has improved.
```

---------

Co-authored-by: Leo <leo@powdrlabs.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

1 participant