diff --git a/Cargo.lock b/Cargo.lock index 0ff651a6c..84393464d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2752,10 +2752,10 @@ dependencies = [ [[package]] name = "crepe" -version = "0.1.8" -source = "git+https://github.com/powdr-labs/crepe?rev=powdr-0.1.11#360082251739fd5afdc5e06b59bb10994daa8fd8" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d6bb2d4233a2b6b6e72b1cfbf5190dd329a37325d6be25c23536d5cc9b0b0df" dependencies = [ - "itertools 0.10.5", "petgraph", "proc-macro-error", "proc-macro2", @@ -4034,12 +4034,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" -[[package]] -name = "gcd" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d758ba1b47b00caf47f24925c0074ecb20d6dfcffe7f6d53395c0465674841a" - [[package]] name = "generational-arena" version = "0.2.9" @@ -6329,18 +6323,6 @@ dependencies = [ "libc", ] -[[package]] -name = "nums" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf3c74f925fb8cfc49a8022f2afce48a0683b70f9e439885594e84c5edbf5b01" -dependencies = [ - "num-bigint", - "num-integer", - "num-traits", - "rand 0.8.5", -] - [[package]] name = "nvtx" version = "1.3.0" @@ -7631,12 +7613,14 @@ dependencies = [ "openvm-transpiler", "openvm-verify-stark-host", "powdr-autoprecompiles", + "powdr-elf-optimizer", "powdr-openvm", "powdr-openvm-riscv", "powdr-openvm-riscv-hints-circuit", "powdr-riscv-elf", "reth-primitives", "rmp-serde", + "rustc-demangle", "serde", "serde_json", "tokio", @@ -7971,7 +7955,7 @@ dependencies = [ "num-bigint", "openvm-codec-derive", "p3-air", - "p3-challenger", + "p3-challenger 0.4.1", "p3-dft 0.4.1", "p3-field 0.4.1", "p3-interpolation", @@ -8183,27 +8167,13 @@ dependencies = [ "p3-matrix 0.4.1", ] -[[package]] -name = "p3-baby-bear" -version = "0.1.0" -source = "git+https://github.com/plonky3/Plonky3.git?rev=2192432ddf28e7359dd2c577447886463e6124f0#2192432ddf28e7359dd2c577447886463e6124f0" -dependencies = [ - "p3-field 0.1.0", - "p3-mds 0.1.0", - "p3-monty-31 0.1.0", - "p3-poseidon2 0.1.0", - "p3-symmetric 0.1.0", - "rand 0.8.5", - "serde", -] - [[package]] name = "p3-baby-bear" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f2fecd03416a20949dc7cd4b481c37d744c4d398467f94213c65279a0f00048" dependencies = [ - "p3-challenger", + "p3-challenger 0.4.1", "p3-field 0.4.1", "p3-mds 0.4.1", "p3-monty-31 0.4.1", @@ -8212,6 +8182,22 @@ dependencies = [ "rand 0.9.2", ] +[[package]] +name = "p3-baby-bear" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "536fc2d7c0ab48ff916582277424f8973228ea05a99fb9af16f2b2502fd80ec9" +dependencies = [ + "p3-challenger 0.5.2", + "p3-field 0.5.2", + "p3-mds 0.5.2", + "p3-monty-31 0.5.2", + "p3-poseidon1", + "p3-poseidon2 0.5.2", + "p3-symmetric 0.5.2", + "rand 0.10.1", +] + [[package]] name = "p3-bn254" version = "0.4.1" @@ -8243,15 +8229,16 @@ dependencies = [ ] [[package]] -name = "p3-dft" -version = "0.1.0" -source = "git+https://github.com/plonky3/Plonky3.git?rev=2192432ddf28e7359dd2c577447886463e6124f0#2192432ddf28e7359dd2c577447886463e6124f0" +name = "p3-challenger" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a0b490c745a7d2adeeafff06411814c8078c432740162332b3cd71be0158a76" dependencies = [ - "itertools 0.13.0", - "p3-field 0.1.0", - "p3-matrix 0.1.0", - "p3-maybe-rayon 0.1.0", - "p3-util 0.1.0", + "p3-field 0.5.2", + "p3-maybe-rayon 0.5.2", + "p3-monty-31 0.5.2", + "p3-symmetric 0.5.2", + "p3-util 0.5.2", "tracing", ] @@ -8271,19 +8258,17 @@ dependencies = [ ] [[package]] -name = "p3-field" -version = "0.1.0" -source = "git+https://github.com/plonky3/Plonky3.git?rev=2192432ddf28e7359dd2c577447886463e6124f0#2192432ddf28e7359dd2c577447886463e6124f0" +name = "p3-dft" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55301e91544440254977108b85c32c09d7ea05f2f0dd61092a2825339906a4a7" dependencies = [ - "itertools 0.13.0", - "num-bigint", - "num-integer", - "num-traits", - "nums", - "p3-maybe-rayon 0.1.0", - "p3-util 0.1.0", - "rand 0.8.5", - "serde", + "itertools 0.14.0", + "p3-field 0.5.2", + "p3-matrix 0.5.2", + "p3-maybe-rayon 0.5.2", + "p3-util 0.5.2", + "spin 0.10.0", "tracing", ] @@ -8303,6 +8288,22 @@ dependencies = [ "tracing", ] +[[package]] +name = "p3-field" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85affca7fc983889f260655c4cf74163eebb94605f702e4b6809ead707cba54f" +dependencies = [ + "itertools 0.14.0", + "num-bigint", + "p3-maybe-rayon 0.5.2", + "p3-util 0.5.2", + "paste", + "rand 0.10.1", + "serde", + "tracing", +] + [[package]] name = "p3-interpolation" version = "0.4.1" @@ -8332,31 +8333,18 @@ dependencies = [ [[package]] name = "p3-koala-bear" -version = "0.1.0" -source = "git+https://github.com/plonky3/Plonky3.git?rev=2192432ddf28e7359dd2c577447886463e6124f0#2192432ddf28e7359dd2c577447886463e6124f0" -dependencies = [ - "p3-field 0.1.0", - "p3-mds 0.1.0", - "p3-monty-31 0.1.0", - "p3-poseidon2 0.1.0", - "p3-symmetric 0.1.0", - "rand 0.8.5", - "serde", -] - -[[package]] -name = "p3-matrix" -version = "0.1.0" -source = "git+https://github.com/plonky3/Plonky3.git?rev=2192432ddf28e7359dd2c577447886463e6124f0#2192432ddf28e7359dd2c577447886463e6124f0" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7369a8eb2a27b314338f6b4b77e6a701ad31f1deff25b75bd302fc08c924c9b3" dependencies = [ - "itertools 0.13.0", - "p3-field 0.1.0", - "p3-maybe-rayon 0.1.0", - "p3-util 0.1.0", - "rand 0.8.5", - "serde", - "tracing", - "transpose", + "p3-challenger 0.5.2", + "p3-field 0.5.2", + "p3-mds 0.5.2", + "p3-monty-31 0.5.2", + "p3-poseidon1", + "p3-poseidon2 0.5.2", + "p3-symmetric 0.5.2", + "rand 0.10.1", ] [[package]] @@ -8376,9 +8364,19 @@ dependencies = [ ] [[package]] -name = "p3-maybe-rayon" -version = "0.1.0" -source = "git+https://github.com/plonky3/Plonky3.git?rev=2192432ddf28e7359dd2c577447886463e6124f0#2192432ddf28e7359dd2c577447886463e6124f0" +name = "p3-matrix" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53428126b009071563d1d07305a9de8be0d21de00b57d2475289ee32ffca6577" +dependencies = [ + "itertools 0.14.0", + "p3-field 0.5.2", + "p3-maybe-rayon 0.5.2", + "p3-util 0.5.2", + "rand 0.10.1", + "serde", + "tracing", +] [[package]] name = "p3-maybe-rayon" @@ -8390,18 +8388,10 @@ dependencies = [ ] [[package]] -name = "p3-mds" -version = "0.1.0" -source = "git+https://github.com/plonky3/Plonky3.git?rev=2192432ddf28e7359dd2c577447886463e6124f0#2192432ddf28e7359dd2c577447886463e6124f0" -dependencies = [ - "itertools 0.13.0", - "p3-dft 0.1.0", - "p3-field 0.1.0", - "p3-matrix 0.1.0", - "p3-symmetric 0.1.0", - "p3-util 0.1.0", - "rand 0.8.5", -] +name = "p3-maybe-rayon" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "082bf467011c06c768c579ec6eb9accb5e1e62108891634cc770396e917f978a" [[package]] name = "p3-mds" @@ -8417,43 +8407,37 @@ dependencies = [ ] [[package]] -name = "p3-mersenne-31" -version = "0.1.0" -source = "git+https://github.com/plonky3/Plonky3.git?rev=2192432ddf28e7359dd2c577447886463e6124f0#2192432ddf28e7359dd2c577447886463e6124f0" +name = "p3-mds" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35209e6214102ea6ec6b8cb1b9c15a9b8e597a39f9173597c957f123bced81b3" dependencies = [ - "itertools 0.13.0", - "num-bigint", - "p3-dft 0.1.0", - "p3-field 0.1.0", - "p3-matrix 0.1.0", - "p3-maybe-rayon 0.1.0", - "p3-mds 0.1.0", - "p3-poseidon2 0.1.0", - "p3-symmetric 0.1.0", - "p3-util 0.1.0", - "rand 0.8.5", - "serde", + "p3-dft 0.5.2", + "p3-field 0.5.2", + "p3-symmetric 0.5.2", + "p3-util 0.5.2", + "rand 0.10.1", ] [[package]] -name = "p3-monty-31" -version = "0.1.0" -source = "git+https://github.com/plonky3/Plonky3.git?rev=2192432ddf28e7359dd2c577447886463e6124f0#2192432ddf28e7359dd2c577447886463e6124f0" +name = "p3-mersenne-31" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f71ab5340a5b15a613e637f48046723dcd3cf14fa23598586a1691e1dcf33185" dependencies = [ - "itertools 0.13.0", + "itertools 0.14.0", "num-bigint", - "p3-dft 0.1.0", - "p3-field 0.1.0", - "p3-matrix 0.1.0", - "p3-maybe-rayon 0.1.0", - "p3-mds 0.1.0", - "p3-poseidon2 0.1.0", - "p3-symmetric 0.1.0", - "p3-util 0.1.0", - "rand 0.8.5", + "p3-challenger 0.5.2", + "p3-dft 0.5.2", + "p3-field 0.5.2", + "p3-matrix 0.5.2", + "p3-mds 0.5.2", + "p3-poseidon2 0.5.2", + "p3-symmetric 0.5.2", + "p3-util 0.5.2", + "paste", + "rand 0.10.1", "serde", - "tracing", - "transpose", ] [[package]] @@ -8481,15 +8465,38 @@ dependencies = [ ] [[package]] -name = "p3-poseidon2" -version = "0.1.0" -source = "git+https://github.com/plonky3/Plonky3.git?rev=2192432ddf28e7359dd2c577447886463e6124f0#2192432ddf28e7359dd2c577447886463e6124f0" +name = "p3-monty-31" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffa8c99ec50c035020bbf5457c6a729ba6a975719c1a8dd3f16421081e4f650c" dependencies = [ - "gcd", - "p3-field 0.1.0", - "p3-mds 0.1.0", - "p3-symmetric 0.1.0", - "rand 0.8.5", + "itertools 0.14.0", + "num-bigint", + "p3-dft 0.5.2", + "p3-field 0.5.2", + "p3-matrix 0.5.2", + "p3-maybe-rayon 0.5.2", + "p3-mds 0.5.2", + "p3-poseidon1", + "p3-poseidon2 0.5.2", + "p3-symmetric 0.5.2", + "p3-util 0.5.2", + "paste", + "rand 0.10.1", + "serde", + "spin 0.10.0", + "tracing", +] + +[[package]] +name = "p3-poseidon1" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a018b618e3fa0aec8be933b1d8e404edd23f46991f6bf3f5c2f3f95e9413fe9" +dependencies = [ + "p3-field 0.5.2", + "p3-symmetric 0.5.2", + "rand 0.10.1", ] [[package]] @@ -8505,6 +8512,19 @@ dependencies = [ "rand 0.9.2", ] +[[package]] +name = "p3-poseidon2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "256a668a9ba916f8767552f13d0ba50d18968bc74a623bfdafa41e2970c944d0" +dependencies = [ + "p3-field 0.5.2", + "p3-mds 0.5.2", + "p3-symmetric 0.5.2", + "p3-util 0.5.2", + "rand 0.10.1", +] + [[package]] name = "p3-poseidon2-air" version = "0.4.1" @@ -8522,40 +8542,44 @@ dependencies = [ [[package]] name = "p3-symmetric" -version = "0.1.0" -source = "git+https://github.com/plonky3/Plonky3.git?rev=2192432ddf28e7359dd2c577447886463e6124f0#2192432ddf28e7359dd2c577447886463e6124f0" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dabf1c93a83305b291118dec6632357da69f3137d33fc1791225e38fcb615836" dependencies = [ - "itertools 0.13.0", - "p3-field 0.1.0", + "itertools 0.14.0", + "p3-field 0.4.1", "serde", ] [[package]] name = "p3-symmetric" -version = "0.4.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dabf1c93a83305b291118dec6632357da69f3137d33fc1791225e38fcb615836" +checksum = "6c60a71a1507c13611b0f2b0b6e83669fd5b76f8e3115bcbced5ccfdf3ca7807" dependencies = [ "itertools 0.14.0", - "p3-field 0.4.1", + "p3-field 0.5.2", + "p3-util 0.5.2", "serde", ] [[package]] name = "p3-util" -version = "0.1.0" -source = "git+https://github.com/plonky3/Plonky3.git?rev=2192432ddf28e7359dd2c577447886463e6124f0#2192432ddf28e7359dd2c577447886463e6124f0" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a92074eab13c8a30d23ad7bcf99b82787a04c843133a0cba39ca1cf39d434492" dependencies = [ "serde", ] [[package]] name = "p3-util" -version = "0.4.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92074eab13c8a30d23ad7bcf99b82787a04c843133a0cba39ca1cf39d434492" +checksum = "f8b766b9e9254bf3fa98d76e42cf8a5b30628c182dfd5272d270076ee12f0fc0" dependencies = [ "serde", + "transpose", ] [[package]] @@ -8965,7 +8989,6 @@ dependencies = [ [[package]] name = "powdr-autoprecompiles" version = "0.1.4" -source = "git+https://github.com/powdr-labs/powdr.git?branch=main#96c231217bd2665b532e000e364cd01f6709f4b6" dependencies = [ "deepsize2", "derivative", @@ -8989,7 +9012,6 @@ dependencies = [ [[package]] name = "powdr-constraint-solver" version = "0.1.4" -source = "git+https://github.com/powdr-labs/powdr.git?branch=main#96c231217bd2665b532e000e364cd01f6709f4b6" dependencies = [ "auto_enums", "bitvec", @@ -9003,10 +9025,18 @@ dependencies = [ "serde", ] +[[package]] +name = "powdr-elf-optimizer" +version = "0.1.4" +dependencies = [ + "goblin", + "powdr-riscv-elf", + "rustc-demangle", +] + [[package]] name = "powdr-expression" version = "0.1.4" -source = "git+https://github.com/powdr-labs/powdr.git?branch=main#96c231217bd2665b532e000e364cd01f6709f4b6" dependencies = [ "derive_more 2.0.1", "num-traits", @@ -9018,12 +9048,10 @@ dependencies = [ [[package]] name = "powdr-isa-utils" version = "0.1.4" -source = "git+https://github.com/powdr-labs/powdr.git?branch=main#96c231217bd2665b532e000e364cd01f6709f4b6" [[package]] name = "powdr-number" version = "0.1.4" -source = "git+https://github.com/powdr-labs/powdr.git?branch=main#96c231217bd2665b532e000e364cd01f6709f4b6" dependencies = [ "ark-bn254 0.4.0", "ark-ff 0.4.2", @@ -9033,8 +9061,8 @@ dependencies = [ "ibig", "num-bigint", "num-traits", - "p3-baby-bear 0.1.0", - "p3-field 0.1.0", + "p3-baby-bear 0.5.2", + "p3-field 0.5.2", "p3-koala-bear", "p3-mersenne-31", "schemars 0.8.22", @@ -9046,7 +9074,6 @@ dependencies = [ [[package]] name = "powdr-openvm" version = "0.1.4" -source = "git+https://github.com/powdr-labs/powdr.git?branch=main#96c231217bd2665b532e000e364cd01f6709f4b6" dependencies = [ "cfg-if", "derive_more 2.0.1", @@ -9069,6 +9096,7 @@ dependencies = [ "openvm-transpiler", "powdr-autoprecompiles", "powdr-constraint-solver", + "powdr-elf-optimizer", "powdr-expression", "powdr-number", "powdr-openvm-bus-interaction-handler", @@ -9081,7 +9109,6 @@ dependencies = [ [[package]] name = "powdr-openvm-bus-interaction-handler" version = "0.1.4" -source = "git+https://github.com/powdr-labs/powdr.git?branch=main#96c231217bd2665b532e000e364cd01f6709f4b6" dependencies = [ "itertools 0.14.0", "powdr-autoprecompiles", @@ -9094,7 +9121,6 @@ dependencies = [ [[package]] name = "powdr-openvm-riscv" version = "0.1.4" -source = "git+https://github.com/powdr-labs/powdr.git?branch=main#96c231217bd2665b532e000e364cd01f6709f4b6" dependencies = [ "cfg-if", "clap", @@ -9153,7 +9179,6 @@ dependencies = [ [[package]] name = "powdr-openvm-riscv-hints-circuit" version = "0.1.4" -source = "git+https://github.com/powdr-labs/powdr.git?branch=main#96c231217bd2665b532e000e364cd01f6709f4b6" dependencies = [ "crypto-bigint 0.6.1", "elliptic-curve", @@ -9171,7 +9196,6 @@ dependencies = [ [[package]] name = "powdr-openvm-riscv-hints-guest" version = "0.1.4" -source = "git+https://github.com/powdr-labs/powdr.git?branch=main#96c231217bd2665b532e000e364cd01f6709f4b6" dependencies = [ "openvm-custom-insn 0.1.0 (git+https://github.com/powdr-labs/openvm.git?tag=v2.0.0-beta.2-powdr)", "openvm-platform 2.0.0-beta.2 (git+https://github.com/powdr-labs/openvm.git?tag=v2.0.0-beta.2-powdr)", @@ -9182,7 +9206,6 @@ dependencies = [ [[package]] name = "powdr-openvm-riscv-hints-transpiler" version = "0.1.4" -source = "git+https://github.com/powdr-labs/powdr.git?branch=main#96c231217bd2665b532e000e364cd01f6709f4b6" dependencies = [ "openvm-instructions", "openvm-instructions-derive", @@ -9196,7 +9219,6 @@ dependencies = [ [[package]] name = "powdr-riscv-elf" version = "0.1.4" -source = "git+https://github.com/powdr-labs/powdr.git?branch=main#96c231217bd2665b532e000e364cd01f6709f4b6" dependencies = [ "gimli", "goblin", @@ -9213,7 +9235,6 @@ dependencies = [ [[package]] name = "powdr-riscv-types" version = "0.1.4" -source = "git+https://github.com/powdr-labs/powdr.git?branch=main#96c231217bd2665b532e000e364cd01f6709f4b6" dependencies = [ "powdr-isa-utils", ] @@ -9221,7 +9242,6 @@ dependencies = [ [[package]] name = "powdr-syscalls" version = "0.1.4" -source = "git+https://github.com/powdr-labs/powdr.git?branch=main#96c231217bd2665b532e000e364cd01f6709f4b6" [[package]] name = "powerfmt" @@ -9608,6 +9628,15 @@ dependencies = [ "serde", ] +[[package]] +name = "rand" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207" +dependencies = [ + "rand_core 0.10.1", +] + [[package]] name = "rand_chacha" version = "0.3.1" @@ -9647,6 +9676,12 @@ dependencies = [ "serde", ] +[[package]] +name = "rand_core" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + [[package]] name = "rand_xorshift" version = "0.3.0" diff --git a/Cargo.toml b/Cargo.toml index e3db7e70f..d7723ddba 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -131,6 +131,7 @@ powdr-openvm = { git = "https://github.com/powdr-labs/powdr.git", branch = "main powdr-openvm-riscv = { git = "https://github.com/powdr-labs/powdr.git", branch = "main", default-features = false } powdr-openvm-riscv-hints-circuit = { git = "https://github.com/powdr-labs/powdr.git", branch = "main", default-features = false } powdr-riscv-elf = { git = "https://github.com/powdr-labs/powdr.git", branch = "main", default-features = false } +powdr-elf-optimizer = { path = "../powdr/elf-optimizer" } [workspace.lints] rust.missing_debug_implementations = "warn" @@ -213,3 +214,12 @@ openvm-cuda-backend = { git = "https://github.com/powdr-labs/stark-backend.git", openvm-cuda-common = { git = "https://github.com/powdr-labs/stark-backend.git", tag = "v2.0.0-beta.2-powdr" } openvm-stark-backend = { git = "https://github.com/powdr-labs/stark-backend.git", tag = "v2.0.0-beta.2-powdr" } openvm-stark-sdk = { git = "https://github.com/powdr-labs/stark-backend.git", tag = "v2.0.0-beta.2-powdr" } + + +[patch."https://github.com/powdr-labs/powdr.git"] +powdr-openvm-riscv = { path = "../powdr/openvm-riscv" } +powdr-openvm = { path = "../powdr/openvm" } +powdr-riscv-elf = { path = "../powdr/riscv-elf" } +powdr-number = { path = "../powdr/number" } +powdr-autoprecompiles = { path = "../powdr/autoprecompiles" } +powdr-openvm-riscv-hints-circuit = { path = "../powdr/openvm-riscv/extensions/hints-circuit" } \ No newline at end of file diff --git a/bin/reth-benchmark/Cargo.toml b/bin/reth-benchmark/Cargo.toml index 7941f5a9c..d222d5986 100644 --- a/bin/reth-benchmark/Cargo.toml +++ b/bin/reth-benchmark/Cargo.toml @@ -18,6 +18,7 @@ tracing-subscriber.workspace = true tracing.workspace = true dotenv = "0.15.0" clap = { version = "4.5.7", features = ["derive", "env"] } +rustc-demangle = "0.1.25" clap_builder = "4.5.34" bincode = { workspace = true, features = ["std"] } bitcode.workspace = true @@ -63,6 +64,7 @@ powdr-openvm.workspace = true powdr-openvm-riscv.workspace = true powdr-openvm-riscv-hints-circuit.workspace = true powdr-riscv-elf.workspace = true +powdr-elf-optimizer.workspace = true # halo2 halo2-axiom = { version = "0.5.0", default-features = false, optional = true } diff --git a/bin/reth-benchmark/src/lib.rs b/bin/reth-benchmark/src/lib.rs index c48ff0342..c3e05e5b7 100644 --- a/bin/reth-benchmark/src/lib.rs +++ b/bin/reth-benchmark/src/lib.rs @@ -11,6 +11,7 @@ use alloy_provider::RootProvider; use alloy_rpc_client::RpcClient; use alloy_transport::layers::RetryBackoffLayer; use clap::Parser; +use openvm::platform::print; use openvm_circuit::arch::*; use openvm_rpc_proxy::{RpcExecutor, DEFAULT_PREIMAGE_CACHE_NIBBLES}; use openvm_sdk::{ @@ -48,14 +49,15 @@ use openvm_verify_stark_host::{ use powdr_autoprecompiles::{ empirical_constraints::EmpiricalConstraints, execution_profile::execution_profile, PgoType, }; -use powdr_openvm::{ - default_powdr_openvm_config, extraction_utils::OriginalVmConfig, BabyBearOpenVmApcAdapter, - CompiledProgram, OriginalCompiledProgram, PowdrExecutionProfileSdkCpu, Prog, -}; #[cfg(not(feature = "cuda"))] use powdr_openvm::PowdrSdkCpu; #[cfg(feature = "cuda")] use powdr_openvm::PowdrSdkGpu; +use powdr_openvm::{ + default_powdr_openvm_config, extraction_utils::OriginalVmConfig, BabyBearOpenVmApcAdapter, + CompiledProgram, OriginalCompiledProgram, PowdrExecutionProfileSdkCpu, Prog, + flamechart_from_guest, +}; use powdr_openvm_riscv::{compile_exe, ExtendedVmConfig, PgoConfig, RiscvISA}; use powdr_openvm_riscv_hints_circuit::HintsExtension; use serde::{Deserialize, Serialize}; @@ -93,6 +95,8 @@ pub enum BenchMode { GenerateVmVkey, /// Dump per-AIR statistics and exit. DumpAirStats, + /// Profile the guest execution and write a folded-stacks flame chart. + Profile, } impl std::fmt::Display for BenchMode { @@ -110,6 +114,7 @@ impl std::fmt::Display for BenchMode { Self::Keygen => write!(f, "keygen"), Self::GenerateVmVkey => write!(f, "generate_vm_vkey"), Self::DumpAirStats => write!(f, "dump_air_stats"), + Self::Profile => write!(f, "profile"), } } } @@ -352,13 +357,11 @@ pub async fn precompute_prover_data( // OpenVM only installs its tracing subscriber when `run_with_metric_collection` // is entered, so we install a local one here to surface powdr's APC compile // progress logs. - let subscriber = tracing_subscriber::FmtSubscriber::builder() - .with_max_level(tracing::Level::DEBUG) - .finish(); + let subscriber = + tracing_subscriber::FmtSubscriber::builder().with_max_level(tracing::Level::DEBUG).finish(); let _guard = tracing::subscriber::set_default(subscriber); - let cache_file_path = - args.apc_cache_dir.join(&args.apc_setup_name).with_extension("bin"); + let cache_file_path = args.apc_cache_dir.join(&args.apc_setup_name).with_extension("bin"); // MessagePack (rmp-serde) instead of bincode because powdr's `CompiledProgram` // pulls in dynamically-typed serde bits that bincode2 errors on @@ -678,6 +681,11 @@ pub async fn run_reth_benchmark(args: HostArgs, openvm_client_eth_elf: &[u8]) -> let stdin = vec![encoded_stateless_input].into(); + println!("14"); + + // Capture raw ELF bytes for modes that need to re-build the original exe. + let elf_bytes = openvm_client_eth_elf.to_vec(); + run_with_metric_collection("OUTPUT_PATH", move || { info_span!("reth-block", block_number = block_number).in_scope(|| -> eyre::Result<()> { match args.mode { @@ -758,8 +766,94 @@ pub async fn run_reth_benchmark(args: HostArgs, openvm_client_eth_elf: &[u8]) -> info!(" App VK: {}", app_vk_path.display()); info!(" Agg PK: {}", agg_pk_path.display()); } + BenchMode::Profile => { + use std::collections::BTreeMap; + + let sample_rate: u64 = std::env::var("FLAMECHART_SAMPLE_RATE") + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or(10_000); + let output_path = std::env::var("FLAMECHART_OUTPUT") + .unwrap_or_else(|_| "profile.folded".to_string()); + + // Re-build the original (pre-APC) exe from the raw ELF bytes. + let profile_params = + app_params_with_100_bits_security(DEFAULT_LOG_STACKED_HEIGHT); + let profile_app_config = AppConfig::new(vm_config.clone(), profile_params); + let profile_sdk = PowdrExecutionProfileSdkCpu::::new( + profile_app_config, + AggregationSystemParams::default(), + )?; + // Apply the ELF optimizer so the profiler runs against the same + // instructions as the actual benchmark, and so that optimizer- + // generated routines appear in the symbol table. + let optimized_elf_bytes = powdr_elf_optimizer::optimize_elf(&elf_bytes); + let orig_elf = Elf::decode(&optimized_elf_bytes, MEM_SIZE as u32)?; + let orig_exe = profile_sdk.convert_to_exe(orig_elf)?; + + // Build function name lookup from the ELF symbol table. + // Filter to addresses within the RISC-V program text range + // (>= 0x200000) to exclude placeholder/debug symbols at + // address 0 that would otherwise appear as the root of every + // call stack via the `range(..=pc).next_back()` heuristic. + let elf_prog = powdr_riscv_elf::load_elf_from_buffer(&optimized_elf_bytes); + let entry_pc = elf_prog.entry_point(); + let fn_bounds: BTreeMap = elf_prog + .debug_info() + .symbols + .table() + .iter() + .filter(|(addr, _)| **addr >= 0x200000) + .filter_map(|(addr, names): (&u32, &Vec)| { + names.first().map(|n| { + // Demangled Rust names can contain ';' (e.g. array + // types like `[u8; 4usize]`). The folded-stacks + // format uses ';' as a frame separator, so any + // literal semicolons must be replaced before writing. + // ',' is the natural substitute for array-size syntax. + let demangled = + rustc_demangle::demangle(n).to_string().replace(';', ","); + (*addr, demangled) + }) + }) + .collect(); + + // The ELF entry point (_start) is typically a NOTYPE symbol, + // so it is excluded from the STT_FUNC/STT_OBJECT symbol table. + // Insert it explicitly so the call-stack seed in FlamechartCollector + // resolves to "_start" rather than falling back to the nearest + // preceding function (memcpy). + let entry_name = elf_prog + .debug_info() + .symbols + .try_get_one(entry_pc) + .unwrap_or("_start") + .to_string(); + let mut fn_bounds = fn_bounds; + fn_bounds.entry(entry_pc).or_insert(entry_name); + + let orig_program = OriginalCompiledProgram::::new( + orig_exe, + OriginalVmConfig::new(vm_config), + elf_prog, + ); + + info!( + "Starting flamechart profiling (sample_rate={sample_rate}), output → {output_path}" + ); + let mut output_file = std::fs::File::create(&output_path)?; + flamechart_from_guest( + &orig_program, + stdin, + fn_bounds, + sample_rate, + entry_pc, + &mut output_file, + ); + info!("Flamechart profile written to {output_path}"); + } _ => { - // MakeInput, ExecuteHost, GenerateVmVkey, DumpAirStats handled earlier + // MakeInput, ExecuteHost, GenerateVmVkey, DumpAirStats handled earlier. unreachable!(); } } diff --git a/bin/reth-benchmark/src/main.rs b/bin/reth-benchmark/src/main.rs index 8af569192..e7cee4d9b 100644 --- a/bin/reth-benchmark/src/main.rs +++ b/bin/reth-benchmark/src/main.rs @@ -8,5 +8,7 @@ const OPENVM_STATELESS_GUEST_ELF: &[u8] = include_bytes!("../elf/openvm-stateles #[tokio::main] async fn main() -> eyre::Result<()> { let args = HostArgs::parse(); - run_reth_benchmark(args, OPENVM_STATELESS_GUEST_ELF).await + let optimized_elf = powdr_elf_optimizer::optimize_elf(OPENVM_STATELESS_GUEST_ELF); + // run_reth_benchmark(args, OPENVM_STATELESS_GUEST_ELF).await + run_reth_benchmark(args, &optimized_elf).await } diff --git a/run.sh b/run.sh index 826ca594d..11b2f3671 100755 --- a/run.sh +++ b/run.sh @@ -75,6 +75,7 @@ USE_PERF=false USE_NSYS=false USE_NCU=false COMPUTE_SANITIZER_ARGS="" +ADDITIONAL_FEATURES="" while [[ $# -gt 0 ]]; do case $1 in @@ -190,6 +191,10 @@ while [[ $# -gt 0 ]]; do INTERNAL_LOG_STACKED_HEIGHT="$2" shift 2 ;; + --features) + ADDITIONAL_FEATURES="$2" + shift 2 + ;; *) echo "Unknown argument: $1" exit 1 @@ -264,6 +269,7 @@ fi if [ "$MODE" = "prove-evm" ]; then FEATURES="$FEATURES,evm-verify" fi +FEATURES="$FEATURES${ADDITIONAL_FEATURES:+,$ADDITIONAL_FEATURES}" arch=$(uname -m) case $arch in @@ -362,6 +368,7 @@ fi # --num-children-internal 3 export RUST_LOG="info,p3_=warn" +export GUEST_SYMBOLS_PATH="${GUEST_SYMBOLS_PATH:-$REPO_ROOT/guest_symbols.bin}" if [ "$USE_PERF" = "true" ]; then # Set sampling frequency based on mode