From 4c6ed54f7601314d1287c107a149d96e7d002472 Mon Sep 17 00:00:00 2001 From: Fedor Sakharov Date: Tue, 13 Jan 2026 14:38:25 +0100 Subject: [PATCH 01/10] initial commit for gpu msm --- Cargo.lock | 314 +++++++++++++++++++++++- Cargo.toml | 3 + dp-crypto/Cargo.toml | 15 +- dp-crypto/benches/msm.rs | 97 ++++++++ dp-crypto/build.rs | 11 + dp-crypto/src/arkyper/gpu_msm.rs | 101 ++++++++ dp-crypto/src/arkyper/mod.rs | 2 + dp-crypto/src/sumcheck/macros.rs | 2 + dp-crypto/src/sumcheck/mod.rs | 2 - dp-crypto/src/sumcheck/virtual_poly.rs | 1 - dp-crypto/src/sumcheck/virtual_polys.rs | 1 - 11 files changed, 535 insertions(+), 14 deletions(-) create mode 100644 dp-crypto/benches/msm.rs create mode 100644 dp-crypto/build.rs create mode 100644 dp-crypto/src/arkyper/gpu_msm.rs diff --git a/Cargo.lock b/Cargo.lock index 3550b4e..74fc2f2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -492,6 +492,12 @@ dependencies = [ "serde", ] +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "bitflags" version = "2.10.0" @@ -549,7 +555,7 @@ version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ - "generic-array", + "generic-array 0.14.7", ] [[package]] @@ -649,6 +655,17 @@ dependencies = [ "half", ] +[[package]] +name = "cl3" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b823f24e72fa0c68aa14a250ae1c0848e68d4ae188b71c3972343e45b46f8644" +dependencies = [ + "libc", + "opencl-sys", + "thiserror 1.0.69", +] + [[package]] name = "clap" version = "4.5.53" @@ -857,6 +874,15 @@ dependencies = [ "itertools 0.13.0", ] +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-deque" version = "0.8.6" @@ -894,7 +920,7 @@ version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ - "generic-array", + "generic-array 0.14.7", "typenum", ] @@ -918,6 +944,24 @@ dependencies = [ "syn 2.0.111", ] +[[package]] +name = "cuda-config" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ee74643f7430213a1a78320f88649de309b20b80818325575e393f848f79f5d" +dependencies = [ + "glob", +] + +[[package]] +name = "cuda-driver-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d4c552cc0de854877d80bcd1f11db75d42be32962d72a6799b88dcca88fffbd" +dependencies = [ + "cuda-config", +] + [[package]] name = "derivative" version = "2.2.0" @@ -1070,6 +1114,8 @@ dependencies = [ "blake3", "criterion 0.7.0", "divan", + "ec-gpu", + "ec-gpu-gen", "either", "env_logger", "ff_ext", @@ -1097,6 +1143,43 @@ dependencies = [ "transcript 0.1.0 (git+https://github.com/Lagrange-Labs/gkr-backend.git?branch=deep-prove-extra-features)", ] +[[package]] +name = "ec-gpu" +version = "0.2.0" +source = "git+https://github.com/Lagrange-Labs/ec-gpu?branch=fvs-ark-bn254-support#338bb61d931a9c57372c268789c2451fe2512370" +dependencies = [ + "ark-bn254", + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-std 0.5.0", +] + +[[package]] +name = "ec-gpu-gen" +version = "0.7.1" +source = "git+https://github.com/Lagrange-Labs/ec-gpu?branch=fvs-ark-bn254-support#338bb61d931a9c57372c268789c2451fe2512370" +dependencies = [ + "ark-bn254", + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-std 0.5.0", + "bitvec", + "crossbeam-channel", + "ec-gpu", + "execute", + "hex", + "log", + "num_cpus", + "once_cell", + "rayon", + "rust-gpu-tools", + "sha2", + "thiserror 1.0.69", + "yastl", +] + [[package]] name = "educe" version = "0.6.0" @@ -1210,6 +1293,43 @@ version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca81e6b4777c89fd810c25a4be2b1bd93ea034fbe58e6a75216a34c6b82c539b" +[[package]] +name = "execute" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0be3cc61fe54b4cae4463cdbda0401978ffe19d4dcc7a5201a312cddf64726dd" +dependencies = [ + "execute-command-macro", + "execute-command-tokens", + "generic-array 1.3.5", +] + +[[package]] +name = "execute-command-macro" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3e748391d89b43c52decaed8645b4a83a09d14f5ee868071c6813389e9e7036" +dependencies = [ + "execute-command-macro-impl", +] + +[[package]] +name = "execute-command-macro-impl" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57dd896da3fbb77138059b015c013459d96063c66bcdd3b9094ff2e9d3f19a47" +dependencies = [ + "execute-command-tokens", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "execute-command-tokens" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "729eda2ea2f6c5ef85150c85a9b2ce0a8e01f040e59cdb32521eaa6c840c9d51" + [[package]] name = "eyre" version = "0.6.12" @@ -1255,6 +1375,18 @@ dependencies = [ "serde", ] +[[package]] +name = "fil-rustacuda" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40666d4072d5353fd2fd3aa26e4ddb225c38c6440e8c467cae9b17688ae6191c" +dependencies = [ + "bitflags 1.3.2", + "cuda-driver-sys", + "rustacuda_core", + "rustacuda_derive", +] + [[package]] name = "find-msvc-tools" version = "0.1.5" @@ -1277,6 +1409,15 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "flume" +version = "0.10.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577" +dependencies = [ + "spin", +] + [[package]] name = "fnv" version = "1.0.7" @@ -1403,6 +1544,16 @@ dependencies = [ "version_check", ] +[[package]] +name = "generic-array" +version = "1.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaf57c49a95fd1fe24b90b3033bee6dc7e8f1288d51494cb44e627c295e38542" +dependencies = [ + "rustversion", + "typenum", +] + [[package]] name = "getrandom" version = "0.2.16" @@ -1561,6 +1712,21 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "home" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" +dependencies = [ + "windows-sys 0.61.2", +] + [[package]] name = "http" version = "1.4.0" @@ -2079,7 +2245,7 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" dependencies = [ - "bitflags", + "bitflags 2.10.0", "libc", ] @@ -2095,6 +2261,15 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + [[package]] name = "log" version = "0.4.28" @@ -2317,6 +2492,16 @@ dependencies = [ "libm", ] +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + [[package]] name = "number_prefix" version = "0.4.0" @@ -2376,13 +2561,32 @@ version = "11.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" +[[package]] +name = "opencl-sys" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de15dd01496ae90c5799f5266184ab020082b4065800ff0b732f489371d0e5cf" +dependencies = [ + "libc", +] + +[[package]] +name = "opencl3" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26ab4a90cb496f787d3934deb0c54fa9d65e7bed710c10071234aab0196fba04" +dependencies = [ + "cl3", + "libc", +] + [[package]] name = "openssl" version = "0.10.75" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" dependencies = [ - "bitflags", + "bitflags 2.10.0", "cfg-if", "foreign-types", "libc", @@ -2690,6 +2894,29 @@ dependencies = [ "group", ] +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link", +] + [[package]] name = "pasta_curves" version = "0.5.1" @@ -2933,6 +3160,15 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.10.0", +] + [[package]] name = "redox_users" version = "0.4.6" @@ -3070,6 +3306,40 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "rust-gpu-tools" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0ce78d5548a74fad25177825d0c20f4cfbc6eaf796bcee53afe792e39ede4e2" +dependencies = [ + "fil-rustacuda", + "hex", + "home", + "log", + "once_cell", + "opencl3", + "sha2", + "temp-env", + "thiserror 1.0.69", +] + +[[package]] +name = "rustacuda_core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3858b08976dc2f860c5efbbb48cdcb0d4fafca92a6ac0898465af16c0dbe848" + +[[package]] +name = "rustacuda_derive" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43ce8670a1a1d0fc2514a3b846dacdb65646f9bd494b6674cfacbb4ce430bd7e" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "rustc-demangle" version = "0.1.26" @@ -3091,7 +3361,7 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" dependencies = [ - "bitflags", + "bitflags 2.10.0", "errno", "libc", "linux-raw-sys", @@ -3170,13 +3440,19 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + [[package]] name = "security-framework" version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags", + "bitflags 2.10.0", "core-foundation", "core-foundation-sys", "libc", @@ -3344,6 +3620,9 @@ name = "spin" version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] [[package]] name = "stable_deref_trait" @@ -3521,7 +3800,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags", + "bitflags 2.10.0", "core-foundation", "system-configuration-sys", ] @@ -3548,6 +3827,15 @@ version = "0.12.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" +[[package]] +name = "temp-env" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96374855068f47402c3121c6eed88d29cb1de8f3ab27090e273e420bdabcf050" +dependencies = [ + "parking_lot", +] + [[package]] name = "tempfile" version = "3.23.0" @@ -3747,7 +4035,7 @@ version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9cf146f99d442e8e68e585f5d798ccd3cad9a7835b917e09728880a862706456" dependencies = [ - "bitflags", + "bitflags 2.10.0", "bytes", "futures-util", "http", @@ -4473,6 +4761,16 @@ dependencies = [ "tap", ] +[[package]] +name = "yastl" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca6c5a4d66c1a9ea261811cf4773c27343de7e5033e1b75ea3f297dc7db3c1a" +dependencies = [ + "flume", + "scopeguard", +] + [[package]] name = "yoke" version = "0.8.1" diff --git a/Cargo.toml b/Cargo.toml index 256be06..6526271 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,7 +16,10 @@ ark-std = { version = "0.5.0", features = ["std","getrandom"]} dp-crypto = { path = "dp-crypto" } ark-ff = { version = "0.5.0", features = ["std"] } ark-bn254 = { version = "0.5.0", features = ["std"]} +ark-ec = { version = "0.5.0", features = ["std"]} sumcheck_macro = { path = "sumcheck_macro" } +ec-gpu = { git = "https://github.com/Lagrange-Labs/ec-gpu", branch = "fvs-ark-bn254-support", features = ["arkworks"] } +ec-gpu-gen = { git = "https://github.com/Lagrange-Labs/ec-gpu", branch = "fvs-ark-bn254-support", features = ["arkworks"] } [patch.crates-io] diff --git a/dp-crypto/Cargo.toml b/dp-crypto/Cargo.toml index 5c5fa90..e820530 100644 --- a/dp-crypto/Cargo.toml +++ b/dp-crypto/Cargo.toml @@ -6,7 +6,7 @@ edition.workspace = true [dependencies] ark-bn254.workspace = true ark-std.workspace = true -ark-ec = { version = "0.5.0", features = ["std"]} +ark-ec.workspace = true ark-ff.workspace = true ark-poly = { version = "0.5.0", features = ["std"]} anyhow = "^1.0" @@ -35,6 +35,12 @@ expander-arith = { git = "https://github.com/nicholas-mainardi/Expander.git", br expander-poly = { git = "https://github.com/nicholas-mainardi/Expander.git", branch = "feat/make_mpi_dependency_optional", package = "polynomials", optional = true } expander-hasher = { git = "https://github.com/nicholas-mainardi/Expander.git", branch = "feat/make_mpi_dependency_optional", package = "gkr_hashers", optional = true } expander-sumcheck = { git = "https://github.com/nicholas-mainardi/Expander.git", branch = "feat/make_mpi_dependency_optional", package = "sumcheck_generic", optional = true } +ec-gpu = { workspace = true, optional = true } +ec-gpu-gen = { workspace = true, optional = true } + +[build-dependencies] +ec-gpu-gen = { workspace = true, optional = true } +ark-bn254 = { workspace = true } [features] default = ["mono"] @@ -48,6 +54,8 @@ nightly-benches = ["parallel", "dep:sumcheck", "dep:multilinear_extensions", "de all-stable = ["mono", "parallel"] asm = ["ark-ff/asm"] mono = [] +cuda = ["dep:ec-gpu", "dep:ec-gpu-gen", "ec-gpu-gen/cuda"] +opencl = ["dep:ec-gpu", "dep:ec-gpu-gen", "ec-gpu-gen/opencl"] [dev-dependencies] criterion = { version = "0.7.0", features = ["html_reports"]} @@ -79,4 +87,7 @@ harness = false name = "pcs" harness = false - +[[bench]] +name = "msm" +harness = false +required-features = ["cuda"] diff --git a/dp-crypto/benches/msm.rs b/dp-crypto/benches/msm.rs new file mode 100644 index 0000000..3906efe --- /dev/null +++ b/dp-crypto/benches/msm.rs @@ -0,0 +1,97 @@ +use std::sync::Arc; + +use ark_bn254::{Fr, G1Affine, G1Projective}; +use ark_ec::{CurveGroup, scalar_mul::variable_base::VariableBaseMSM}; +use ark_std::{UniformRand, test_rng}; +use divan::Bencher; +use dp_crypto::arkyper::gpu_msm::{GpuMsm, convert_bases_to_gpu, convert_scalars_to_bigint}; + +fn main() { + divan::main(); +} + +const SIZES: [usize; 5] = [12, 14, 16, 18, 20]; + +fn generate_random_bases(n: usize) -> Vec { + let mut rng = test_rng(); + (0..n) + .map(|_| G1Projective::rand(&mut rng).into_affine()) + .collect() +} + +fn generate_random_scalars(n: usize) -> Vec { + let mut rng = test_rng(); + (0..n).map(|_| Fr::rand(&mut rng)).collect() +} + +#[divan::bench_group(sample_count = 5, sample_size = 1)] +mod cpu_msm { + use super::*; + + #[divan::bench(args = SIZES)] + fn arkworks_msm(b: Bencher, n: usize) { + let size = 1 << n; + b.with_inputs(|| { + let bases = generate_random_bases(size); + let scalars = generate_random_scalars(size); + (bases, scalars) + }) + .bench_local_values(|(bases, scalars)| { + ::msm(&bases, &scalars).unwrap() + }) + } +} + +#[divan::bench_group(sample_count = 5, sample_size = 1)] +mod gpu_msm_bench { + use super::*; + + #[divan::bench(args = SIZES)] + fn gpu_msm(b: Bencher, n: usize) { + let size = 1 << n; + let mut gpu = GpuMsm::new().expect("Failed to create GPU MSM"); + + b.with_inputs(|| { + let bases = generate_random_bases(size); + let scalars = generate_random_scalars(size); + (bases, scalars) + }) + .bench_local_values(|(bases, scalars)| gpu.msm(&bases, &scalars).unwrap()) + } + + #[divan::bench(args = SIZES)] + fn gpu_msm_preconverted(b: Bencher, n: usize) { + let size = 1 << n; + let mut gpu = GpuMsm::new().expect("Failed to create GPU MSM"); + + b.with_inputs(|| { + let bases = generate_random_bases(size); + let scalars = generate_random_scalars(size); + let bases_gpu = Arc::new(convert_bases_to_gpu(&bases)); + let scalars_bigint = Arc::new(convert_scalars_to_bigint(&scalars)); + (bases_gpu, scalars_bigint) + }) + .bench_local_values(|(bases_gpu, scalars_bigint)| { + gpu.msm_arc(bases_gpu, scalars_bigint).unwrap() + }) + } +} + +#[divan::bench_group(sample_count = 3, sample_size = 1)] +mod conversion_overhead { + use super::*; + + #[divan::bench(args = SIZES)] + fn bases_conversion(b: Bencher, n: usize) { + let size = 1 << n; + b.with_inputs(|| generate_random_bases(size)) + .bench_local_values(|bases| convert_bases_to_gpu(&bases)) + } + + #[divan::bench(args = SIZES)] + fn scalars_conversion(b: Bencher, n: usize) { + let size = 1 << n; + b.with_inputs(|| generate_random_scalars(size)) + .bench_local_values(|scalars| convert_scalars_to_bigint(&scalars)) + } +} diff --git a/dp-crypto/build.rs b/dp-crypto/build.rs new file mode 100644 index 0000000..7fc4d64 --- /dev/null +++ b/dp-crypto/build.rs @@ -0,0 +1,11 @@ +#[cfg(any(feature = "cuda", feature = "opencl"))] +fn main() { + use ark_bn254::{Fq, Fr, G1Affine}; + use ec_gpu_gen::SourceBuilder; + + let source = SourceBuilder::new().add_multiexp::(); + ec_gpu_gen::generate(&source); +} + +#[cfg(not(any(feature = "cuda", feature = "opencl")))] +fn main() {} diff --git a/dp-crypto/src/arkyper/gpu_msm.rs b/dp-crypto/src/arkyper/gpu_msm.rs new file mode 100644 index 0000000..d5439c6 --- /dev/null +++ b/dp-crypto/src/arkyper/gpu_msm.rs @@ -0,0 +1,101 @@ +use std::sync::Arc; + +use ark_bn254::{Fr, G1Affine, G1Projective}; +use ark_ff::PrimeField; +use ec_gpu_gen::{G1AffineM, MultiexpKernel, program, rust_gpu_tools::Device, threadpool::Worker}; + +pub struct GpuMsm { + kernel: MultiexpKernel<'static, G1Affine>, + pool: Worker, +} + +impl GpuMsm { + pub fn new() -> anyhow::Result { + let devices = Device::all(); + if devices.is_empty() { + return Err(anyhow::anyhow!("No GPU devices found")); + } + + let programs: Vec<_> = devices + .iter() + .map(|device| program!(device)) + .collect::>() + .map_err(|e| anyhow::anyhow!("Failed to create GPU program: {e}"))?; + + let kernel = MultiexpKernel::create(programs, &devices) + .map_err(|e| anyhow::anyhow!("Failed to create MSM kernel: {e}"))?; + + let pool = Worker::new(); + + Ok(Self { kernel, pool }) + } + + pub fn new_single_device(device_index: usize) -> anyhow::Result { + let devices = Device::all(); + if devices.is_empty() { + return Err(anyhow::anyhow!("No GPU devices found")); + } + if device_index >= devices.len() { + return Err(anyhow::anyhow!( + "Device index {} out of range (available: {})", + device_index, + devices.len() + )); + } + + let device = &devices[device_index]; + let program = + program!(device).map_err(|e| anyhow::anyhow!("Failed to create GPU program: {e}"))?; + + let kernel = MultiexpKernel::create(vec![program], std::slice::from_ref(device)) + .map_err(|e| anyhow::anyhow!("Failed to create MSM kernel: {e}"))?; + + let pool = Worker::new(); + + Ok(Self { kernel, pool }) + } + + pub fn msm(&mut self, bases: &[G1Affine], scalars: &[Fr]) -> anyhow::Result { + if bases.len() != scalars.len() { + return Err(anyhow::anyhow!( + "bases and scalars must have the same length: {} != {}", + bases.len(), + scalars.len() + )); + } + + let bases_gpu: Vec = bases.iter().map(|p| (*p).into()).collect(); + let exps: Vec<_> = scalars.iter().map(|s| s.into_bigint()).collect(); + + let result = self + .kernel + .multiexp(&self.pool, Arc::new(bases_gpu), Arc::new(exps), 0) + .map_err(|e| anyhow::anyhow!("GPU MSM failed: {e}"))?; + + Ok(result) + } + + pub fn msm_arc( + &mut self, + bases: Arc>, + scalars: Arc::BigInt>>, + ) -> anyhow::Result { + self.kernel + .multiexp(&self.pool, bases, scalars, 0) + .map_err(|e| anyhow::anyhow!("GPU MSM failed: {e}")) + } +} + +impl Default for GpuMsm { + fn default() -> Self { + Self::new().expect("Failed to create GpuMsm") + } +} + +pub fn convert_bases_to_gpu(bases: &[G1Affine]) -> Vec { + bases.iter().map(|p| (*p).into()).collect() +} + +pub fn convert_scalars_to_bigint(scalars: &[Fr]) -> Vec<::BigInt> { + scalars.iter().map(|s| s.into_bigint()).collect() +} diff --git a/dp-crypto/src/arkyper/mod.rs b/dp-crypto/src/arkyper/mod.rs index c909dcd..834de68 100644 --- a/dp-crypto/src/arkyper/mod.rs +++ b/dp-crypto/src/arkyper/mod.rs @@ -22,6 +22,8 @@ use rayon::iter::IntoParallelRefIterator; use rayon::iter::ParallelIterator; use std::borrow::Borrow; use std::marker::PhantomData; +#[cfg(any(feature = "cuda", feature = "opencl"))] +pub mod gpu_msm; pub mod interface; pub mod msm; pub mod transcript; diff --git a/dp-crypto/src/sumcheck/macros.rs b/dp-crypto/src/sumcheck/macros.rs index f9b315d..0d4b41c 100644 --- a/dp-crypto/src/sumcheck/macros.rs +++ b/dp-crypto/src/sumcheck/macros.rs @@ -16,5 +16,7 @@ macro_rules! exit_span { }; } +#[allow(unused_imports)] pub(crate) use entered_span; +#[allow(unused_imports)] pub(crate) use exit_span; diff --git a/dp-crypto/src/sumcheck/mod.rs b/dp-crypto/src/sumcheck/mod.rs index b0123bd..8f4cd61 100644 --- a/dp-crypto/src/sumcheck/mod.rs +++ b/dp-crypto/src/sumcheck/mod.rs @@ -8,8 +8,6 @@ use ark_ff::{Field, PrimeField}; use ark_std::rand::Rng; pub use expression::{utils::monomialize_expr_to_wit_terms, *}; -use macros::{entered_span, exit_span}; - use crate::poly::dense::DensePolynomial; #[macro_use] pub mod macros; diff --git a/dp-crypto/src/sumcheck/virtual_poly.rs b/dp-crypto/src/sumcheck/virtual_poly.rs index 9206366..57364d6 100644 --- a/dp-crypto/src/sumcheck/virtual_poly.rs +++ b/dp-crypto/src/sumcheck/virtual_poly.rs @@ -6,7 +6,6 @@ use crate::{ poly::dense::DensePolynomial, sumcheck::{ ArcMultilinearExtension, Expression, WitnessId, - macros::{entered_span, exit_span}, monomial::Term, random_mle_list, util::{bit_decompose, create_uninit_vec, max_usable_threads}, diff --git a/dp-crypto/src/sumcheck/virtual_polys.rs b/dp-crypto/src/sumcheck/virtual_polys.rs index 2e1473a..d744d62 100644 --- a/dp-crypto/src/sumcheck/virtual_polys.rs +++ b/dp-crypto/src/sumcheck/virtual_polys.rs @@ -5,7 +5,6 @@ use crate::{ sumcheck::{ Expression, WitnessId, expression::monomial::Term, - macros::{entered_span, exit_span}, random_mle_list, util::{ceil_log2, log2_strict}, utils::eval_by_expr_with_instance, From 20840c852106d6f579187701253e0b87a9cfb58a Mon Sep 17 00:00:00 2001 From: Fedor Sakharov Date: Tue, 13 Jan 2026 18:07:57 +0100 Subject: [PATCH 02/10] sanity tests and benches decomment --- dp-crypto/Cargo.toml | 5 -- dp-crypto/benches/msm.rs | 97 ------------------------- dp-crypto/benches/pcs.rs | 13 +++- dp-crypto/src/arkyper/gpu_msm.rs | 35 +++++++-- dp-crypto/src/arkyper/mod.rs | 120 +++++++++++++++++++++++++++++++ dp-crypto/src/arkyper/msm.rs | 61 +++++++++++++++- 6 files changed, 219 insertions(+), 112 deletions(-) delete mode 100644 dp-crypto/benches/msm.rs diff --git a/dp-crypto/Cargo.toml b/dp-crypto/Cargo.toml index e820530..faa40e7 100644 --- a/dp-crypto/Cargo.toml +++ b/dp-crypto/Cargo.toml @@ -86,8 +86,3 @@ harness = false [[bench]] name = "pcs" harness = false - -[[bench]] -name = "msm" -harness = false -required-features = ["cuda"] diff --git a/dp-crypto/benches/msm.rs b/dp-crypto/benches/msm.rs deleted file mode 100644 index 3906efe..0000000 --- a/dp-crypto/benches/msm.rs +++ /dev/null @@ -1,97 +0,0 @@ -use std::sync::Arc; - -use ark_bn254::{Fr, G1Affine, G1Projective}; -use ark_ec::{CurveGroup, scalar_mul::variable_base::VariableBaseMSM}; -use ark_std::{UniformRand, test_rng}; -use divan::Bencher; -use dp_crypto::arkyper::gpu_msm::{GpuMsm, convert_bases_to_gpu, convert_scalars_to_bigint}; - -fn main() { - divan::main(); -} - -const SIZES: [usize; 5] = [12, 14, 16, 18, 20]; - -fn generate_random_bases(n: usize) -> Vec { - let mut rng = test_rng(); - (0..n) - .map(|_| G1Projective::rand(&mut rng).into_affine()) - .collect() -} - -fn generate_random_scalars(n: usize) -> Vec { - let mut rng = test_rng(); - (0..n).map(|_| Fr::rand(&mut rng)).collect() -} - -#[divan::bench_group(sample_count = 5, sample_size = 1)] -mod cpu_msm { - use super::*; - - #[divan::bench(args = SIZES)] - fn arkworks_msm(b: Bencher, n: usize) { - let size = 1 << n; - b.with_inputs(|| { - let bases = generate_random_bases(size); - let scalars = generate_random_scalars(size); - (bases, scalars) - }) - .bench_local_values(|(bases, scalars)| { - ::msm(&bases, &scalars).unwrap() - }) - } -} - -#[divan::bench_group(sample_count = 5, sample_size = 1)] -mod gpu_msm_bench { - use super::*; - - #[divan::bench(args = SIZES)] - fn gpu_msm(b: Bencher, n: usize) { - let size = 1 << n; - let mut gpu = GpuMsm::new().expect("Failed to create GPU MSM"); - - b.with_inputs(|| { - let bases = generate_random_bases(size); - let scalars = generate_random_scalars(size); - (bases, scalars) - }) - .bench_local_values(|(bases, scalars)| gpu.msm(&bases, &scalars).unwrap()) - } - - #[divan::bench(args = SIZES)] - fn gpu_msm_preconverted(b: Bencher, n: usize) { - let size = 1 << n; - let mut gpu = GpuMsm::new().expect("Failed to create GPU MSM"); - - b.with_inputs(|| { - let bases = generate_random_bases(size); - let scalars = generate_random_scalars(size); - let bases_gpu = Arc::new(convert_bases_to_gpu(&bases)); - let scalars_bigint = Arc::new(convert_scalars_to_bigint(&scalars)); - (bases_gpu, scalars_bigint) - }) - .bench_local_values(|(bases_gpu, scalars_bigint)| { - gpu.msm_arc(bases_gpu, scalars_bigint).unwrap() - }) - } -} - -#[divan::bench_group(sample_count = 3, sample_size = 1)] -mod conversion_overhead { - use super::*; - - #[divan::bench(args = SIZES)] - fn bases_conversion(b: Bencher, n: usize) { - let size = 1 << n; - b.with_inputs(|| generate_random_bases(size)) - .bench_local_values(|bases| convert_bases_to_gpu(&bases)) - } - - #[divan::bench(args = SIZES)] - fn scalars_conversion(b: Bencher, n: usize) { - let size = 1 << n; - b.with_inputs(|| generate_random_scalars(size)) - .bench_local_values(|scalars| convert_scalars_to_bigint(&scalars)) - } -} diff --git a/dp-crypto/benches/pcs.rs b/dp-crypto/benches/pcs.rs index 036deee..b31d24a 100644 --- a/dp-crypto/benches/pcs.rs +++ b/dp-crypto/benches/pcs.rs @@ -1,5 +1,8 @@ +#[allow(unused_imports)] use ark_bn254::{Bn254, Fr}; +#[allow(unused_imports)] use ark_poly::DenseMultilinearExtension; +#[allow(unused_imports)] use ark_poly_commit::multilinear_pc::MultilinearPC; use ark_std::rand::thread_rng; use divan::Bencher; @@ -7,6 +10,7 @@ use dp_crypto::{ arkyper::{CommitmentScheme, HyperKZG}, poly::{dense::DensePolynomial as ADensePolynomial, slice::SmartSlice}, }; +#[allow(unused_imports)] use jolt_core::poly::{ commitment::{ commitment_scheme::CommitmentScheme as CScheme, hyperkzg::HyperKZG as JoltHyperKZG, @@ -16,13 +20,11 @@ use jolt_core::poly::{ }; fn main() { - // Run registered benchmarks. divan::main(); } -const LENS: [usize; 3] = [12, 14, 16]; +const LENS: [usize; 3] = [20, 23, 25]; -// Register a `fibonacci` function and benchmark it over multiple cases. #[divan::bench_group(sample_count = 3, sample_size = 1)] mod commit { use super::*; @@ -77,10 +79,15 @@ mod open { use ark_bn254::Fr; use ark_ff::AdditiveGroup; use dp_crypto::arkyper::transcript::blake3::Blake3Transcript; + #[allow(unused_imports)] use jolt_core::field::JoltField; + #[allow(unused_imports)] use jolt_core::poly::dense_mlpoly::DensePolynomial as JoltDense; + #[allow(unused_imports)] use jolt_core::poly::multilinear_polynomial::MultilinearPolynomial as JoltMLE; + #[allow(unused_imports)] use jolt_core::transcripts::Blake2bTranscript; + #[allow(unused_imports)] use jolt_core::transcripts::Transcript as T; use super::*; diff --git a/dp-crypto/src/arkyper/gpu_msm.rs b/dp-crypto/src/arkyper/gpu_msm.rs index d5439c6..85d0c7b 100644 --- a/dp-crypto/src/arkyper/gpu_msm.rs +++ b/dp-crypto/src/arkyper/gpu_msm.rs @@ -1,9 +1,13 @@ -use std::sync::Arc; +use std::sync::{Arc, Mutex}; -use ark_bn254::{Fr, G1Affine, G1Projective}; +use ark_bn254::{Fq, Fr, G1Affine, G1Projective}; +use ark_ec::AffineRepr; use ark_ff::PrimeField; use ec_gpu_gen::{G1AffineM, MultiexpKernel, program, rust_gpu_tools::Device, threadpool::Worker}; +pub static GPU_MSM: std::sync::LazyLock> = + std::sync::LazyLock::new(|| Mutex::new(GpuMsm::new().expect("Failed to initialize GPU MSM"))); + pub struct GpuMsm { kernel: MultiexpKernel<'static, G1Affine>, pool: Worker, @@ -64,8 +68,8 @@ impl GpuMsm { )); } - let bases_gpu: Vec = bases.iter().map(|p| (*p).into()).collect(); - let exps: Vec<_> = scalars.iter().map(|s| s.into_bigint()).collect(); + let bases_gpu = convert_bases_to_gpu(bases); + let exps = convert_scalars_to_bigint(scalars); let result = self .kernel @@ -92,8 +96,29 @@ impl Default for GpuMsm { } } +fn fq_to_montgomery_bytes(x: &Fq) -> [u8; 32] { + let limbs = unsafe { std::mem::transmute::(*x) }; + + let mut out = [0u8; 32]; + for (i, limb) in limbs.iter().enumerate() { + let bytes = limb.to_le_bytes(); + out[i * 8..(i + 1) * 8].copy_from_slice(&bytes); + } + out +} + +fn g1_to_gpu(p: &G1Affine) -> G1AffineM { + match p.xy() { + Some((x, y)) => G1AffineM { + x: fq_to_montgomery_bytes(&x), + y: fq_to_montgomery_bytes(&y), + }, + None => G1AffineM::default(), + } +} + pub fn convert_bases_to_gpu(bases: &[G1Affine]) -> Vec { - bases.iter().map(|p| (*p).into()).collect() + bases.iter().map(g1_to_gpu).collect() } pub fn convert_scalars_to_bigint(scalars: &[Fr]) -> Vec<::BigInt> { diff --git a/dp-crypto/src/arkyper/mod.rs b/dp-crypto/src/arkyper/mod.rs index 834de68..0c51515 100644 --- a/dp-crypto/src/arkyper/mod.rs +++ b/dp-crypto/src/arkyper/mod.rs @@ -559,3 +559,123 @@ mod tests { } } } + +#[cfg(all(test, any(feature = "cuda", feature = "opencl")))] +mod gpu_tests { + use super::*; + use crate::{arkyper::transcript::blake3::Blake3Transcript, poly::challenge}; + use ark_bn254::{Bn254, Fr, G1Affine}; + use ark_ec::CurveGroup; + use ark_std::{UniformRand, rand::SeedableRng}; + + #[test] + fn test_msm_gpu_vs_cpu() { + for ell in [10, 12, 14] { + let mut rng = rand_chacha::ChaCha20Rng::seed_from_u64(ell as u64); + let n = 1 << ell; + + let poly_raw = (0..n).map(|_| Fr::rand(&mut rng)).collect::>(); + let poly = DensePolynomial::from(poly_raw); + + let srs = HyperKZGSRS::setup(&mut rng, n); + let (pk, _): (HyperKZGProverKey, HyperKZGVerifierKey) = srs.trim(n); + + let cpu_result = msm::batch_poly_msm_cpu::(pk.g1_powers(), &[&poly]).unwrap(); + let gpu_result = + msm::batch_poly_msm_gpu_bn254::(pk.g1_powers(), &[&poly]).unwrap(); + + assert_eq!(cpu_result.len(), gpu_result.len()); + for (cpu, gpu) in cpu_result.iter().zip(gpu_result.iter()) { + assert_eq!( + cpu.into_affine(), + gpu.into_affine(), + "MSM results differ for ell={ell}" + ); + } + } + } + + #[test] + fn test_commit_gpu_vs_cpu() { + for ell in [10, 12, 14] { + let mut rng = rand_chacha::ChaCha20Rng::seed_from_u64(ell as u64 + 100); + let n = 1 << ell; + + let poly_raw = (0..n).map(|_| Fr::rand(&mut rng)).collect::>(); + let poly = DensePolynomial::from(poly_raw); + + let srs = HyperKZGSRS::setup(&mut rng, n); + let (pk, _): (HyperKZGProverKey, HyperKZGVerifierKey) = srs.trim(n); + + let cpu_commit = + msm::batch_poly_msm_cpu::(pk.g1_powers(), &[&poly]).unwrap()[0]; + let gpu_commit = HyperKZG::::commit(&pk, &poly).unwrap().0; + + assert_eq!( + cpu_commit.into_affine(), + gpu_commit.0, + "Commit results differ for ell={ell}" + ); + } + } + + #[test] + fn test_open_gpu_produces_valid_proof() { + for ell in [10, 12] { + let mut rng = rand_chacha::ChaCha20Rng::seed_from_u64(ell as u64 + 200); + let n = 1 << ell; + + let poly_raw = (0..n).map(|_| Fr::rand(&mut rng)).collect::>(); + let poly = DensePolynomial::from(poly_raw); + let point = (0..ell) + .map(|_| challenge::random_challenge::(&mut rng)) + .collect::>(); + let eval = poly.evaluate(&point).unwrap(); + + let srs = HyperKZGSRS::setup(&mut rng, n); + let (pk, vk): (HyperKZGProverKey, HyperKZGVerifierKey) = srs.trim(n); + + let (comm, _) = HyperKZG::commit(&pk, &poly).unwrap(); + + let mut prover_transcript = Blake3Transcript::new(b"GpuTest"); + let proof = HyperKZG::open(&pk, &poly, &point, &eval, &mut prover_transcript).unwrap(); + + let mut verifier_transcript = Blake3Transcript::new(b"GpuTest"); + HyperKZG::verify(&vk, &comm, &point, &eval, &proof, &mut verifier_transcript) + .expect("GPU-generated proof should verify"); + } + } + + #[test] + fn test_batch_msm_gpu_vs_cpu() { + let mut rng = rand_chacha::ChaCha20Rng::seed_from_u64(42); + let ell = 12; + let n = 1 << ell; + let num_polys = 5; + + let polys: Vec> = (0..num_polys) + .map(|_| { + let poly_raw = (0..n).map(|_| Fr::rand(&mut rng)).collect::>(); + DensePolynomial::from(poly_raw) + }) + .collect(); + + let srs = HyperKZGSRS::setup(&mut rng, n); + let (pk, _): (HyperKZGProverKey, HyperKZGVerifierKey) = srs.trim(n); + + let poly_refs: Vec<&DensePolynomial> = polys.iter().collect(); + + let cpu_results = msm::batch_poly_msm_cpu::(pk.g1_powers(), &poly_refs).unwrap(); + let gpu_results = + msm::batch_poly_msm_gpu_bn254::(pk.g1_powers(), &poly_refs).unwrap(); + + assert_eq!(cpu_results.len(), gpu_results.len()); + for (i, (cpu, gpu)) in cpu_results.iter().zip(gpu_results.iter()).enumerate() { + assert_eq!( + cpu.into_affine(), + gpu.into_affine(), + "Batch MSM results differ for poly {i}" + ); + } + } +} diff --git a/dp-crypto/src/arkyper/msm.rs b/dp-crypto/src/arkyper/msm.rs index f0250f7..4875d28 100644 --- a/dp-crypto/src/arkyper/msm.rs +++ b/dp-crypto/src/arkyper/msm.rs @@ -7,6 +7,7 @@ use ark_std::cfg_iter; use rayon::prelude::*; use crate::poly::dense::DensePolynomial; + pub fn poly_msm<'a, A: AffineRepr>( g1_powers: &[A], poly: &impl Borrow>, @@ -15,9 +16,31 @@ pub fn poly_msm<'a, A: AffineRepr>( Ok(r.remove(0)) } +#[cfg(not(any(feature = "cuda", feature = "opencl")))] +pub fn batch_poly_msm<'a, A: AffineRepr>( + g1_powers: &[A], + polys: &[impl Borrow>], +) -> anyhow::Result> { + batch_poly_msm_cpu(g1_powers, polys) +} + +#[cfg(any(feature = "cuda", feature = "opencl"))] pub fn batch_poly_msm<'a, A: AffineRepr>( g1_powers: &[A], polys: &[impl Borrow>], +) -> anyhow::Result> { + use std::any::TypeId; + + if TypeId::of::() == TypeId::of::() { + batch_poly_msm_gpu_bn254(g1_powers, polys) + } else { + batch_poly_msm_cpu(g1_powers, polys) + } +} + +pub fn batch_poly_msm_cpu<'a, A: AffineRepr>( + g1_powers: &[A], + polys: &[impl Borrow>], ) -> anyhow::Result> { let coeffs = polys .iter() @@ -26,8 +49,6 @@ pub fn batch_poly_msm<'a, A: AffineRepr>( let r = cfg_iter!(coeffs) .map(|coeffs| { let msm_size = coeffs.len(); - // TODO: move to msm_bigint as they do in arkworks KZG - // https://github.com/arkworks-rs/poly-commit/blob/master/poly-commit/src/kzg10/mod.rs#L171-L204 ::msm(&g1_powers[..msm_size], coeffs) .map_err(|e| anyhow::anyhow!("MSM error: {e}")) }) @@ -35,6 +56,42 @@ pub fn batch_poly_msm<'a, A: AffineRepr>( Ok(r) } +#[cfg(any(feature = "cuda", feature = "opencl"))] +pub fn batch_poly_msm_gpu_bn254<'a, A: AffineRepr>( + g1_powers: &[A], + polys: &[impl Borrow>], +) -> anyhow::Result> { + use std::sync::Arc; + + use super::gpu_msm::{GPU_MSM, convert_bases_to_gpu, convert_scalars_to_bigint}; + + let bases: &[ark_bn254::G1Affine] = unsafe { std::mem::transmute(g1_powers) }; + let bases_gpu = Arc::new(convert_bases_to_gpu(bases)); + + let results: Vec = polys + .iter() + .map(|poly| { + let coeffs = poly.borrow().evals_ref(); + let scalars: &[ark_bn254::Fr] = unsafe { std::mem::transmute(coeffs) }; + let msm_size = scalars.len(); + let scalars_bigint = Arc::new(convert_scalars_to_bigint(&scalars[..msm_size])); + + let bases_slice = Arc::new(bases_gpu[..msm_size].to_vec()); + + let result: ark_bn254::G1Projective = GPU_MSM + .lock() + .unwrap() + .msm_arc(bases_slice, scalars_bigint) + .map_err(|e| anyhow::anyhow!("GPU MSM error: {e}"))?; + + let result_generic: A::Group = unsafe { std::mem::transmute_copy(&result) }; + Ok(result_generic) + }) + .collect::>>()?; + + Ok(results) +} + pub fn msm, F: PrimeField>( g_powers: &[G::Affine], coeffs: &[F], From 41b299d4b0311b85721c04e4baeeddf9e6a9f845 Mon Sep 17 00:00:00 2001 From: Fedor Sakharov Date: Tue, 13 Jan 2026 18:31:46 +0100 Subject: [PATCH 03/10] add gpu test workflow --- .github/workflows/test-gpu.yml | 37 ++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 .github/workflows/test-gpu.yml diff --git a/.github/workflows/test-gpu.yml b/.github/workflows/test-gpu.yml new file mode 100644 index 0000000..3f31e4c --- /dev/null +++ b/.github/workflows/test-gpu.yml @@ -0,0 +1,37 @@ +name: "GPU testing with ec-gpu" + +on: + pull_request: + types: + - opened + - edited + - synchronize + - reopened + - ready_for_review + +concurrency: + group: gpu-test-${{ github.ref }} + cancel-in-progress: true + +jobs: + build: + name: "Test GPU blitzar code against our own" + runs-on: ['gpu'] + steps: + - uses: actions/checkout@v4 + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@stable + - name: Cache cargo registry + uses: actions/cache@v4 + with: + path: | + ~/.cargo/bin/ + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + target/ + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo- + - name: Run tests on features 'parallel,cuda' + run: cargo test --features='parallel,cuda' From 49f7b78793479c3bacced0fa4573073647c4689c Mon Sep 17 00:00:00 2001 From: Fedor Sakharov Date: Tue, 13 Jan 2026 18:32:58 +0100 Subject: [PATCH 04/10] fix test step name --- .github/workflows/test-gpu.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-gpu.yml b/.github/workflows/test-gpu.yml index 3f31e4c..1b82ca9 100644 --- a/.github/workflows/test-gpu.yml +++ b/.github/workflows/test-gpu.yml @@ -15,7 +15,7 @@ concurrency: jobs: build: - name: "Test GPU blitzar code against our own" + name: "Test ec-gpu" runs-on: ['gpu'] steps: - uses: actions/checkout@v4 From fc80877da0d03d9483854e3aee1c52a946ddf16b Mon Sep 17 00:00:00 2001 From: Fedor Sakharov Date: Tue, 13 Jan 2026 18:38:26 +0100 Subject: [PATCH 05/10] fix bench poly sizes --- dp-crypto/benches/pcs.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dp-crypto/benches/pcs.rs b/dp-crypto/benches/pcs.rs index 500561c..888debc 100644 --- a/dp-crypto/benches/pcs.rs +++ b/dp-crypto/benches/pcs.rs @@ -23,7 +23,7 @@ fn main() { divan::main(); } -const LENS: [usize; 3] = [20, 23, 25]; +const LENS: [usize; 3] = [12, 14, 16]; const NUM_BATCHED_POLYS: [usize; 2] = [3, 5]; From af6ebdace1fe98dae14c527c8db49a54aa35b472 Mon Sep 17 00:00:00 2001 From: nicolas gailly Date: Wed, 14 Jan 2026 11:54:12 +0100 Subject: [PATCH 06/10] rayon processing the inputs --- dp-crypto/src/arkyper/gpu_msm.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/dp-crypto/src/arkyper/gpu_msm.rs b/dp-crypto/src/arkyper/gpu_msm.rs index 85d0c7b..ed2b1a3 100644 --- a/dp-crypto/src/arkyper/gpu_msm.rs +++ b/dp-crypto/src/arkyper/gpu_msm.rs @@ -4,6 +4,7 @@ use ark_bn254::{Fq, Fr, G1Affine, G1Projective}; use ark_ec::AffineRepr; use ark_ff::PrimeField; use ec_gpu_gen::{G1AffineM, MultiexpKernel, program, rust_gpu_tools::Device, threadpool::Worker}; +use rayon::prelude::*; pub static GPU_MSM: std::sync::LazyLock> = std::sync::LazyLock::new(|| Mutex::new(GpuMsm::new().expect("Failed to initialize GPU MSM"))); @@ -118,9 +119,9 @@ fn g1_to_gpu(p: &G1Affine) -> G1AffineM { } pub fn convert_bases_to_gpu(bases: &[G1Affine]) -> Vec { - bases.iter().map(g1_to_gpu).collect() + bases.par_iter().map(g1_to_gpu).collect() } pub fn convert_scalars_to_bigint(scalars: &[Fr]) -> Vec<::BigInt> { - scalars.iter().map(|s| s.into_bigint()).collect() + scalars.par_iter().map(|s| s.into_bigint()).collect() } From 5865a587fe08f6223baa54ac292121f6e0291013 Mon Sep 17 00:00:00 2001 From: Fedor Sakharov Date: Wed, 14 Jan 2026 20:24:57 +0100 Subject: [PATCH 07/10] g2 also --- Cargo.lock | 428 ++++++++++++++++--------------- dp-crypto/Cargo.toml | 1 + dp-crypto/build.rs | 7 +- dp-crypto/src/arkyper/gpu_msm.rs | 85 +++++- dp-crypto/src/arkyper/mod.rs | 107 ++++++-- dp-crypto/src/arkyper/msm.rs | 50 +++- 6 files changed, 420 insertions(+), 258 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5c460de..a77842a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -72,7 +72,7 @@ source = "git+https://github.com/facebookexperimental/allocative?rev=85b773d85d5 dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -198,7 +198,7 @@ dependencies = [ [[package]] name = "ark-bn254" version = "0.5.0" -source = "git+https://github.com/a16z/arkworks-algebra?branch=dev%2Ftwist-shout#0ada1da696d851d3728e8c3a2d7f21313121d2c0" +source = "git+https://github.com/a16z/arkworks-algebra?branch=dev%2Ftwist-shout#76bb3a4518928f1ff7f15875f940d614bb9845e6" dependencies = [ "ark-ec", "ark-ff", @@ -238,13 +238,13 @@ checksum = "e7e89fe77d1f0f4fe5b96dfc940923d88d17b6a773808124f21e764dfb063c6a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] name = "ark-ec" version = "0.5.0" -source = "git+https://github.com/a16z/arkworks-algebra?branch=dev%2Ftwist-shout#0ada1da696d851d3728e8c3a2d7f21313121d2c0" +source = "git+https://github.com/a16z/arkworks-algebra?branch=dev%2Ftwist-shout#76bb3a4518928f1ff7f15875f940d614bb9845e6" dependencies = [ "ahash", "ark-ff", @@ -265,7 +265,7 @@ dependencies = [ [[package]] name = "ark-ff" version = "0.5.0" -source = "git+https://github.com/a16z/arkworks-algebra?branch=dev%2Ftwist-shout#0ada1da696d851d3728e8c3a2d7f21313121d2c0" +source = "git+https://github.com/a16z/arkworks-algebra?branch=dev%2Ftwist-shout#76bb3a4518928f1ff7f15875f940d614bb9845e6" dependencies = [ "allocative", "ark-ff-asm", @@ -286,28 +286,28 @@ dependencies = [ [[package]] name = "ark-ff-asm" version = "0.5.0" -source = "git+https://github.com/a16z/arkworks-algebra?branch=dev%2Ftwist-shout#b5f70317cd644638c49a7907da6cf79c5a4f4e0b" +source = "git+https://github.com/a16z/arkworks-algebra?branch=dev%2Ftwist-shout#76bb3a4518928f1ff7f15875f940d614bb9845e6" dependencies = [ "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] name = "ark-ff-macros" version = "0.5.0" -source = "git+https://github.com/a16z/arkworks-algebra?branch=dev%2Ftwist-shout#b5f70317cd644638c49a7907da6cf79c5a4f4e0b" +source = "git+https://github.com/a16z/arkworks-algebra?branch=dev%2Ftwist-shout#76bb3a4518928f1ff7f15875f940d614bb9845e6" dependencies = [ "num-bigint", "num-traits", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] name = "ark-grumpkin" version = "0.5.0" -source = "git+https://github.com/a16z/arkworks-algebra?branch=dev%2Ftwist-shout#0ada1da696d851d3728e8c3a2d7f21313121d2c0" +source = "git+https://github.com/a16z/arkworks-algebra?branch=dev%2Ftwist-shout#76bb3a4518928f1ff7f15875f940d614bb9845e6" dependencies = [ "ark-bn254", "ark-ec", @@ -318,7 +318,7 @@ dependencies = [ [[package]] name = "ark-poly" version = "0.5.0" -source = "git+https://github.com/a16z/arkworks-algebra?branch=dev%2Ftwist-shout#0ada1da696d851d3728e8c3a2d7f21313121d2c0" +source = "git+https://github.com/a16z/arkworks-algebra?branch=dev%2Ftwist-shout#76bb3a4518928f1ff7f15875f940d614bb9845e6" dependencies = [ "ahash", "ark-ff", @@ -386,7 +386,7 @@ dependencies = [ [[package]] name = "ark-serialize" version = "0.5.0" -source = "git+https://github.com/a16z/arkworks-algebra?branch=dev%2Ftwist-shout#0ada1da696d851d3728e8c3a2d7f21313121d2c0" +source = "git+https://github.com/a16z/arkworks-algebra?branch=dev%2Ftwist-shout#76bb3a4518928f1ff7f15875f940d614bb9845e6" dependencies = [ "ark-serialize-derive 0.5.0 (git+https://github.com/a16z/arkworks-algebra?branch=dev%2Ftwist-shout)", "ark-std 0.5.0", @@ -404,17 +404,17 @@ checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] name = "ark-serialize-derive" version = "0.5.0" -source = "git+https://github.com/a16z/arkworks-algebra?branch=dev%2Ftwist-shout#b5f70317cd644638c49a7907da6cf79c5a4f4e0b" +source = "git+https://github.com/a16z/arkworks-algebra?branch=dev%2Ftwist-shout#76bb3a4518928f1ff7f15875f940d614bb9845e6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -538,9 +538,9 @@ dependencies = [ [[package]] name = "blake2b_simd" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06e903a20b159e944f91ec8499fe1e55651480c541ea0a584f5d967c49ad9d99" +checksum = "b79834656f71332577234b50bfc009996f7449e0c056884e6a02492ded0ca2f3" dependencies = [ "arrayref", "arrayvec", @@ -549,15 +549,16 @@ dependencies = [ [[package]] name = "blake3" -version = "1.8.2" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" +checksum = "2468ef7d57b3fb7e16b576e8377cdbde2320c60e1491e961d11da40fc4f02a2d" dependencies = [ "arrayref", "arrayvec", "cc", "cfg-if", "constant_time_eq", + "cpufeatures", ] [[package]] @@ -571,9 +572,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.19.0" +version = "3.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" +checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" [[package]] name = "bytemuck" @@ -589,7 +590,7 @@ checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -612,9 +613,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.47" +version = "1.2.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd405d82c84ff7f35739f175f67d8b9fb7687a0e84ccdc78bd3568839827cf07" +checksum = "cd4932aefd12402b36c60956a4fe0035421f544799057659ff86f923657aada3" dependencies = [ "find-msvc-tools", "shlex", @@ -689,9 +690,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.53" +version = "4.5.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e340e012a1bf4935f5282ed1436d1489548e8f72308207ea5df0e23d2d03f8" +checksum = "c6e6ff9dcd79cff5cd969a17a545d79e84ab086e444102a591e288a8aa3ce394" dependencies = [ "clap_builder", "clap_derive", @@ -699,9 +700,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.53" +version = "4.5.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00" +checksum = "fa42cf4d2b7a41bc8f663a7cab4031ebafa1bf3875705bfaf8466dc60ab52c00" dependencies = [ "anstream", "anstyle", @@ -719,14 +720,14 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] name = "clap_lex" -version = "0.7.6" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" +checksum = "c3e64b0cc0439b12df2fa678eae89a1c56a529fd067a9115f7827f1fffd22b32" [[package]] name = "cobs" @@ -746,10 +747,11 @@ checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" [[package]] name = "common" version = "0.2.0" -source = "git+https://github.com/a16z/jolt#4c0b621cd2e1f27db5a348a475bae632fdc4e6ff" +source = "git+https://github.com/a16z/jolt#1691651740e326304d8bea9599b7e65888bf5d43" dependencies = [ + "allocative", "ark-serialize", - "derive_more 2.0.1", + "derive_more 2.1.1", "serde", "serde_json", "strum", @@ -779,9 +781,9 @@ dependencies = [ [[package]] name = "constant_time_eq" -version = "0.3.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" +checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" [[package]] name = "core-foundation" @@ -962,7 +964,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" dependencies = [ "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -1014,11 +1016,11 @@ dependencies = [ [[package]] name = "derive_more" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" dependencies = [ - "derive_more-impl 2.0.1", + "derive_more-impl 2.1.1", ] [[package]] @@ -1029,19 +1031,20 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", "unicode-xid", ] [[package]] name = "derive_more-impl" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "rustc_version", + "syn 2.0.114", ] [[package]] @@ -1084,7 +1087,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -1109,7 +1112,7 @@ checksum = "9556bc800956545d6420a640173e5ba7dfa82f38d3ea5a167eb555bc69ac3323" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -1120,7 +1123,7 @@ checksum = "92455ee9d76bb8878b7900486c07e880cd019acf144144aa61c799fb6464fefe" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -1190,7 +1193,7 @@ dependencies = [ "sumcheck", "sumcheck_generic", "sumcheck_macro 0.1.0", - "syn 2.0.111", + "syn 2.0.114", "thiserror 2.0.17", "tracing", "transcript 0.1.0 (git+https://github.com/Lagrange-Labs/gkr-backend.git?branch=deep-prove-extra-features)", @@ -1200,7 +1203,7 @@ dependencies = [ [[package]] name = "ec-gpu" version = "0.2.0" -source = "git+https://github.com/Lagrange-Labs/ec-gpu?branch=fvs-ark-bn254-support#338bb61d931a9c57372c268789c2451fe2512370" +source = "git+https://github.com/Lagrange-Labs/ec-gpu?branch=fvs-ark-bn254-support#e12e8c3ac3833af81eb849ebc6e091435e65d9a5" dependencies = [ "ark-bn254", "ark-ec", @@ -1212,7 +1215,7 @@ dependencies = [ [[package]] name = "ec-gpu-gen" version = "0.7.1" -source = "git+https://github.com/Lagrange-Labs/ec-gpu?branch=fvs-ark-bn254-support#338bb61d931a9c57372c268789c2451fe2512370" +source = "git+https://github.com/Lagrange-Labs/ec-gpu?branch=fvs-ark-bn254-support#e12e8c3ac3833af81eb849ebc6e091435e65d9a5" dependencies = [ "ark-bn254", "ark-ec", @@ -1224,6 +1227,7 @@ dependencies = [ "ec-gpu", "execute", "hex", + "home", "log", "num_cpus", "once_cell", @@ -1243,7 +1247,7 @@ dependencies = [ "enum-ordinalize", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -1299,7 +1303,7 @@ checksum = "8ca9601fb2d62598ee17836250842873a413586e5d7ed88b356e38ddbb0ec631" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -1338,7 +1342,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -1375,7 +1379,7 @@ checksum = "57dd896da3fbb77138059b015c013459d96063c66bcdd3b9094ff2e9d3f19a47" dependencies = [ "execute-command-tokens", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -1443,9 +1447,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.5" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" +checksum = "f449e6c6c08c865631d4890cfacf252b3d396c9bcc83adb6623cdb02a8336c41" [[package]] name = "fixedbitset" @@ -1455,9 +1459,9 @@ checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" [[package]] name = "flate2" -version = "1.1.5" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" +checksum = "b375d6465b98090a5f25b1c7703f3859783755aa9a80433b36e0379a3ec2f369" dependencies = [ "crc32fast", "miniz_oxide", @@ -1544,7 +1548,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -1611,9 +1615,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", "js-sys", @@ -1677,9 +1681,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" +checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" dependencies = [ "atomic-waker", "bytes", @@ -1775,11 +1779,11 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "home" -version = "0.5.12" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -1877,9 +1881,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.18" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e9a2a24dc5c6821e71a7030e1e14b7b632acac55c40e9d2e082c621261bb56" +checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f" dependencies = [ "base64", "bytes", @@ -1973,9 +1977,9 @@ checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" [[package]] name = "icu_properties" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" dependencies = [ "icu_collections", "icu_locale_core", @@ -1987,9 +1991,9 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" [[package]] name = "icu_provider" @@ -2035,9 +2039,9 @@ checksum = "964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5" [[package]] name = "indexmap" -version = "2.12.1" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" dependencies = [ "equivalent", "hashbrown 0.16.1", @@ -2073,9 +2077,9 @@ checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "iri-string" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" +checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" dependencies = [ "memchr", "serde", @@ -2089,7 +2093,7 @@ checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" dependencies = [ "hermit-abi", "libc", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -2127,15 +2131,15 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.15" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" [[package]] name = "jiff" -version = "0.2.16" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49cce2b81f2098e7e3efc35bc2e0a6b7abec9d34128283d7a26fa8f32a6dbb35" +checksum = "e67e8da4c49d6d9909fe03361f9b620f58898859f5c7aded68351e85e71ecf50" dependencies = [ "jiff-static", "log", @@ -2146,19 +2150,19 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.16" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "980af8b43c3ad5d8d349ace167ec8170839f753a42d233ba19e08afe1850fa69" +checksum = "e0c84ee7f197eca9a86c6fd6cb771e55eb991632f15f2bc3ca6ec838929e6e78" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] name = "jolt-core" version = "0.1.0" -source = "git+https://github.com/a16z/jolt#4c0b621cd2e1f27db5a348a475bae632fdc4e6ff" +source = "git+https://github.com/a16z/jolt#1691651740e326304d8bea9599b7e65888bf5d43" dependencies = [ "allocative", "anyhow", @@ -2176,7 +2180,7 @@ dependencies = [ "chrono", "clap", "common", - "derive_more 2.0.1", + "derive_more 2.1.1", "dirs", "dory-pcs", "eyre", @@ -2187,13 +2191,11 @@ dependencies = [ "jolt-inlines-sha2", "jolt-optimizations", "jolt-platform", - "lazy_static", "memory-stats", "num", "num-derive", "num-integer", "num-traits", - "once_cell", "paste", "postcard", "rand", @@ -2212,13 +2214,13 @@ dependencies = [ "tracer", "tracing", "tracing-chrome", - "tracing-subscriber 0.3.20", + "tracing-subscriber 0.3.22", ] [[package]] name = "jolt-inlines-keccak256" version = "0.1.0" -source = "git+https://github.com/a16z/jolt#4c0b621cd2e1f27db5a348a475bae632fdc4e6ff" +source = "git+https://github.com/a16z/jolt#1691651740e326304d8bea9599b7e65888bf5d43" dependencies = [ "ctor 0.2.9", "tracer", @@ -2228,7 +2230,7 @@ dependencies = [ [[package]] name = "jolt-inlines-sha2" version = "0.1.0" -source = "git+https://github.com/a16z/jolt#4c0b621cd2e1f27db5a348a475bae632fdc4e6ff" +source = "git+https://github.com/a16z/jolt#1691651740e326304d8bea9599b7e65888bf5d43" dependencies = [ "ctor 0.2.9", "tracer", @@ -2238,7 +2240,7 @@ dependencies = [ [[package]] name = "jolt-optimizations" version = "0.5.0" -source = "git+https://github.com/a16z/arkworks-algebra?branch=dev%2Ftwist-shout#0ada1da696d851d3728e8c3a2d7f21313121d2c0" +source = "git+https://github.com/a16z/arkworks-algebra?branch=dev%2Ftwist-shout#76bb3a4518928f1ff7f15875f940d614bb9845e6" dependencies = [ "ark-bn254", "ark-ec", @@ -2256,18 +2258,18 @@ dependencies = [ [[package]] name = "jolt-platform" version = "0.1.0" -source = "git+https://github.com/a16z/jolt#4c0b621cd2e1f27db5a348a475bae632fdc4e6ff" +source = "git+https://github.com/a16z/jolt#1691651740e326304d8bea9599b7e65888bf5d43" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", "getrandom 0.3.4", "rand", ] [[package]] name = "js-sys" -version = "0.3.82" +version = "0.3.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" +checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" dependencies = [ "once_cell", "wasm-bindgen", @@ -2293,9 +2295,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.177" +version = "0.2.180" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" +checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" [[package]] name = "libm" @@ -2305,9 +2307,9 @@ checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "libredox" -version = "0.1.10" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" +checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" dependencies = [ "bitflags 2.10.0", "libc", @@ -2336,9 +2338,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.28" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] name = "matchers" @@ -2410,9 +2412,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" dependencies = [ "libc", "wasi", @@ -2443,7 +2445,7 @@ dependencies = [ "serde", "sumcheck", "tracing", - "tracing-subscriber 0.3.20", + "tracing-subscriber 0.3.22", "transcript 0.1.0 (git+https://github.com/Lagrange-Labs/gkr-backend.git?branch=deep-prove-extra-features)", "whir", "witness", @@ -2498,7 +2500,7 @@ version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -2543,7 +2545,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -2698,7 +2700,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -3101,9 +3103,9 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.11.1" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" +checksum = "f89776e4d69bb58bc6993e99ffa1d11f228b839984854c7daeb5d37f87cbe950" [[package]] name = "portable-atomic-util" @@ -3167,18 +3169,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.103" +version = "1.0.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.42" +version = "1.0.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a" dependencies = [ "proc-macro2", ] @@ -3223,7 +3225,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", ] [[package]] @@ -3271,7 +3273,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", "libredox", "thiserror 1.0.69", ] @@ -3319,9 +3321,9 @@ checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" [[package]] name = "reqwest" -version = "0.12.24" +version = "0.12.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" dependencies = [ "base64", "bytes", @@ -3367,7 +3369,7 @@ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.16", + "getrandom 0.2.17", "libc", "untrusted", "windows-sys 0.52.0", @@ -3375,22 +3377,19 @@ dependencies = [ [[package]] name = "rmp" -version = "0.8.14" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "228ed7c16fa39782c3b3468e974aec2795e9089153cd08ee2e9aefb3613334c4" +checksum = "4ba8be72d372b2c9b35542551678538b562e7cf86c3315773cae48dfbfe7790c" dependencies = [ - "byteorder", "num-traits", - "paste", ] [[package]] name = "rmp-serde" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e599a477cf9840e92f2cde9a7189e67b42c57532749bf90aea6ec10facd4db" +checksum = "72f81bee8c8ef9b577d1681a70ebbc962c232461e397b22c208c43c04b67a155" dependencies = [ - "byteorder", "rmp", "serde", ] @@ -3420,7 +3419,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.111", + "syn 2.0.114", "unicode-ident", ] @@ -3475,22 +3474,22 @@ dependencies = [ [[package]] name = "rustix" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" +checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" dependencies = [ "bitflags 2.10.0", "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] name = "rustls" -version = "0.23.35" +version = "0.23.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" +checksum = "c665f33d38cea657d9614f766881e4d510e0eda4239891eea56b4cadcf01801b" dependencies = [ "once_cell", "rustls-pki-types", @@ -3501,9 +3500,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.13.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "708c0f9d5f54ba0272468c1d306a52c495b31fa155e91bc25371e6df7996908c" +checksum = "21e6f2ab2928ca4291b86736a8bd920a277a399bba1589409d72154ff87c1282" dependencies = [ "zeroize", ] @@ -3536,9 +3535,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.20" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +checksum = "a50f4cf475b65d88e057964e0e9bb1f0aa9bbb2036dc65c64596b42932536984" [[package]] name = "same-file" @@ -3620,20 +3619,20 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] name = "serde_json" -version = "1.0.145" +version = "1.0.149" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" dependencies = [ "itoa", "memchr", - "ryu", "serde", "serde_core", + "zmij", ] [[package]] @@ -3666,7 +3665,7 @@ source = "git+https://github.com/nicholas-mainardi/Expander.git?branch=feat%2Fma dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -3707,9 +3706,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "simd-adler32" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" [[package]] name = "slab" @@ -3782,7 +3781,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -3854,7 +3853,7 @@ dependencies = [ "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -3867,7 +3866,7 @@ dependencies = [ "proc-macro2", "quote", "rand", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -3883,9 +3882,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.111" +version = "2.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" +checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a" dependencies = [ "proc-macro2", "quote", @@ -3909,7 +3908,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -3956,15 +3955,15 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.23.0" +version = "3.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" +checksum = "655da9c7eb6305c55742045d5a8d2037996d61d8de95806335c7c86ce0f82e9c" dependencies = [ "fastrand", "getrandom 0.3.4", "once_cell", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -4003,7 +4002,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -4014,7 +4013,7 @@ checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -4057,9 +4056,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.48.0" +version = "1.49.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" +checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" dependencies = [ "bytes", "libc", @@ -4091,9 +4090,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.17" +version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" dependencies = [ "bytes", "futures-core", @@ -4104,18 +4103,18 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.7.3" +version = "0.7.5+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" dependencies = [ "serde_core", ] [[package]] name = "toml_edit" -version = "0.23.7" +version = "0.23.10+spec-1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" +checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" dependencies = [ "indexmap", "toml_datetime", @@ -4125,18 +4124,18 @@ dependencies = [ [[package]] name = "toml_parser" -version = "1.0.4" +version = "1.0.6+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" +checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44" dependencies = [ "winnow", ] [[package]] name = "tower" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" dependencies = [ "futures-core", "futures-util", @@ -4149,9 +4148,9 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf146f99d442e8e68e585f5d798ccd3cad9a7835b917e09728880a862706456" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" dependencies = [ "bitflags 2.10.0", "bytes", @@ -4180,17 +4179,16 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracer" version = "0.2.0" -source = "git+https://github.com/a16z/jolt#4c0b621cd2e1f27db5a348a475bae632fdc4e6ff" +source = "git+https://github.com/a16z/jolt#1691651740e326304d8bea9599b7e65888bf5d43" dependencies = [ "addr2line", "ark-serialize", "clap", "common", - "derive_more 2.0.1", + "derive_more 2.1.1", "fnv", "itertools 0.10.5", "jolt-platform", - "lazy_static", "object 0.36.7", "paste", "postcard", @@ -4199,14 +4197,14 @@ dependencies = [ "strum", "strum_macros", "tracing", - "tracing-subscriber 0.3.20", + "tracing-subscriber 0.3.22", ] [[package]] name = "tracing" -version = "0.1.41" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ "pin-project-lite", "tracing-attributes", @@ -4215,13 +4213,13 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -4232,14 +4230,14 @@ checksum = "bf0a738ed5d6450a9fb96e86a23ad808de2b727fd1394585da5cdd6788ffe724" dependencies = [ "serde_json", "tracing-core", - "tracing-subscriber 0.3.20", + "tracing-subscriber 0.3.22", ] [[package]] name = "tracing-core" -version = "0.1.34" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", "valuable", @@ -4267,9 +4265,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.20" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" +checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" dependencies = [ "matchers", "nu-ansi-term", @@ -4385,9 +4383,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.7" +version = "2.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" dependencies = [ "form_urlencoded", "idna", @@ -4469,9 +4467,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.105" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" +checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" dependencies = [ "cfg-if", "once_cell", @@ -4482,9 +4480,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.55" +version = "0.4.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" +checksum = "836d9622d604feee9e5de25ac10e3ea5f2d65b41eac0d9ce72eb5deae707ce7c" dependencies = [ "cfg-if", "js-sys", @@ -4495,9 +4493,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.105" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" +checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4505,31 +4503,31 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.105" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" +checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.105" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" +checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" dependencies = [ "unicode-ident", ] [[package]] name = "web-sys" -version = "0.3.82" +version = "0.3.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" +checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" dependencies = [ "js-sys", "wasm-bindgen", @@ -4574,7 +4572,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.61.2", ] [[package]] @@ -4598,7 +4596,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -4609,7 +4607,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -4880,9 +4878,9 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" -version = "0.7.13" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" +checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" dependencies = [ "memchr", ] @@ -4950,28 +4948,28 @@ checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.30" +version = "0.8.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea879c944afe8a2b25fef16bb4ba234f47c694565e97383b36f3a878219065c" +checksum = "668f5168d10b9ee831de31933dc111a459c97ec93225beb307aed970d1372dfd" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.30" +version = "0.8.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf955aa904d6040f70dc8e9384444cb1030aed272ba3cb09bbc4ab9e7c1f34f5" +checksum = "2c7962b26b0a8685668b671ee4b54d007a67d4eaf05fda79ac0ecf41e32270f1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -4991,7 +4989,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", "synstructure", ] @@ -5006,13 +5004,13 @@ dependencies = [ [[package]] name = "zeroize_derive" -version = "1.4.2" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -5045,5 +5043,11 @@ checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] + +[[package]] +name = "zmij" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd8f3f50b848df28f887acb68e41201b5aea6bc8a8dacc00fb40635ff9a72fea" diff --git a/dp-crypto/Cargo.toml b/dp-crypto/Cargo.toml index cc07f59..66fe7c1 100644 --- a/dp-crypto/Cargo.toml +++ b/dp-crypto/Cargo.toml @@ -42,6 +42,7 @@ ec-gpu-gen = { workspace = true, optional = true } [build-dependencies] ec-gpu-gen = { workspace = true, optional = true } +ec-gpu = { workspace = true, optional = true } ark-bn254 = { workspace = true } [features] diff --git a/dp-crypto/build.rs b/dp-crypto/build.rs index 7fc4d64..561146c 100644 --- a/dp-crypto/build.rs +++ b/dp-crypto/build.rs @@ -1,9 +1,12 @@ #[cfg(any(feature = "cuda", feature = "opencl"))] fn main() { - use ark_bn254::{Fq, Fr, G1Affine}; + use ark_bn254::{Fq, Fq2, Fr}; + use ec_gpu::arkworks_bn254::{G1Affine, G2Affine}; use ec_gpu_gen::SourceBuilder; - let source = SourceBuilder::new().add_multiexp::(); + let source = SourceBuilder::new() + .add_multiexp::() + .add_multiexp::(); ec_gpu_gen::generate(&source); } diff --git a/dp-crypto/src/arkyper/gpu_msm.rs b/dp-crypto/src/arkyper/gpu_msm.rs index ed2b1a3..9f9c78c 100644 --- a/dp-crypto/src/arkyper/gpu_msm.rs +++ b/dp-crypto/src/arkyper/gpu_msm.rs @@ -1,20 +1,37 @@ use std::sync::{Arc, Mutex}; -use ark_bn254::{Fq, Fr, G1Affine, G1Projective}; +use ark_bn254::{Fq, Fq2, Fr, G1Projective, G2Projective}; use ark_ec::AffineRepr; use ark_ff::PrimeField; +<<<<<<< HEAD use ec_gpu_gen::{G1AffineM, MultiexpKernel, program, rust_gpu_tools::Device, threadpool::Worker}; use rayon::prelude::*; +||||||| parent of 1a19569 (g2 also) +use ec_gpu_gen::{G1AffineM, MultiexpKernel, program, rust_gpu_tools::Device, threadpool::Worker}; +======= +use ec_gpu::arkworks_bn254::{G1Affine, G2Affine}; +use ec_gpu_gen::{ + program, rust_gpu_tools::Device, threadpool::Worker, G1AffineM, G2AffineM, MultiexpKernel, +}; +>>>>>>> 1a19569 (g2 also) + +pub static GPU_MSM_G1: std::sync::LazyLock> = + std::sync::LazyLock::new(|| Mutex::new(GpuMsmG1::new().expect("Failed to initialize GPU MSM"))); -pub static GPU_MSM: std::sync::LazyLock> = - std::sync::LazyLock::new(|| Mutex::new(GpuMsm::new().expect("Failed to initialize GPU MSM"))); +pub static GPU_MSM_G2: std::sync::LazyLock> = + std::sync::LazyLock::new(|| Mutex::new(GpuMsmG2::new().expect("Failed to initialize GPU MSM"))); -pub struct GpuMsm { +pub struct GpuMsmG1 { kernel: MultiexpKernel<'static, G1Affine>, pool: Worker, } -impl GpuMsm { +pub struct GpuMsmG2 { + kernel: MultiexpKernel<'static, G2Affine>, + pool: Worker, +} + +impl GpuMsmG1 { pub fn new() -> anyhow::Result { let devices = Device::all(); if devices.is_empty() { @@ -91,9 +108,36 @@ impl GpuMsm { } } -impl Default for GpuMsm { - fn default() -> Self { - Self::new().expect("Failed to create GpuMsm") +impl GpuMsmG2 { + pub fn new() -> anyhow::Result { + let devices = Device::all(); + if devices.is_empty() { + return Err(anyhow::anyhow!("No GPU devices found")); + } + + let programs: Vec<_> = devices + .iter() + .map(|device| program!(device)) + .collect::>() + .map_err(|e| anyhow::anyhow!("Failed to create GPU program: {e}"))?; + + let kernel = MultiexpKernel::create(programs, &devices) + .map_err(|e| anyhow::anyhow!("Failed to create MSM kernel: {e}"))?; + + let pool = Worker::new(); + + Ok(Self { kernel, pool }) + } + + pub fn msm_arc( + &mut self, + bases: Arc>, + scalars: Arc::BigInt>>, + ) -> anyhow::Result { + self.kernel + .multiexp(&self.pool, bases, scalars, 0) + .map_err(|e| anyhow::anyhow!("GPU MSM failed: {e}")) +>>>>>>> c9c471f (g2 also) } } @@ -108,7 +152,14 @@ fn fq_to_montgomery_bytes(x: &Fq) -> [u8; 32] { out } -fn g1_to_gpu(p: &G1Affine) -> G1AffineM { +fn fq2_to_montgomery_bytes(x: &Fq2) -> [u8; 64] { + let mut out = [0u8; 64]; + out[..32].copy_from_slice(&fq_to_montgomery_bytes(&x.c0)); + out[32..].copy_from_slice(&fq_to_montgomery_bytes(&x.c1)); + out +} + +fn g1_to_gpu(p: &ark_bn254::G1Affine) -> G1AffineM { match p.xy() { Some((x, y)) => G1AffineM { x: fq_to_montgomery_bytes(&x), @@ -118,10 +169,24 @@ fn g1_to_gpu(p: &G1Affine) -> G1AffineM { } } -pub fn convert_bases_to_gpu(bases: &[G1Affine]) -> Vec { +fn g2_to_gpu(p: &ark_bn254::G2Affine) -> G2AffineM { + match p.xy() { + Some((x, y)) => G2AffineM { + x: fq2_to_montgomery_bytes(&x), + y: fq2_to_montgomery_bytes(&y), + }, + None => G2AffineM::default(), + } +} + +pub fn convert_g1_bases_to_gpu(bases: &[ark_bn254::G1Affine]) -> Vec { bases.par_iter().map(g1_to_gpu).collect() } +pub fn convert_g2_bases_to_gpu(bases: &[ark_bn254::G2Affine]) -> Vec { + bases.par_iter().map(g2_to_gpu).collect() +} + pub fn convert_scalars_to_bigint(scalars: &[Fr]) -> Vec<::BigInt> { scalars.par_iter().map(|s| s.into_bigint()).collect() } diff --git a/dp-crypto/src/arkyper/mod.rs b/dp-crypto/src/arkyper/mod.rs index df4246a..f27f7b0 100644 --- a/dp-crypto/src/arkyper/mod.rs +++ b/dp-crypto/src/arkyper/mod.rs @@ -644,12 +644,53 @@ mod tests { mod gpu_tests { use super::*; use crate::{arkyper::transcript::blake3::Blake3Transcript, poly::challenge}; - use ark_bn254::{Bn254, Fr, G1Affine}; - use ark_ec::CurveGroup; + use ark_bn254::{Bn254, Fr, G1Affine, G2Affine}; + use ark_ec::{AffineRepr, CurveGroup}; use ark_std::{UniformRand, rand::SeedableRng}; + fn test_msm_gpu_vs_cpu_generic>( + bases: &[A], + poly: &DensePolynomial, + ell: usize, + ) where + A::Group: CurveGroup, + { + let cpu_result = msm::batch_poly_msm_cpu::(bases, &[poly]).unwrap(); + let gpu_result = msm::batch_poly_msm::(bases, &[poly]).unwrap(); + + assert_eq!(cpu_result.len(), gpu_result.len()); + for (cpu, gpu) in cpu_result.iter().zip(gpu_result.iter()) { + assert_eq!( + cpu.into_affine(), + gpu.into_affine(), + "MSM results differ for ell={ell}" + ); + } + } + + fn test_batch_msm_gpu_vs_cpu_generic>( + bases: &[A], + polys: &[DensePolynomial], + ) where + A::Group: CurveGroup, + { + let poly_refs: Vec<&DensePolynomial> = polys.iter().collect(); + + let cpu_results = msm::batch_poly_msm_cpu::(bases, &poly_refs).unwrap(); + let gpu_results = msm::batch_poly_msm::(bases, &poly_refs).unwrap(); + + assert_eq!(cpu_results.len(), gpu_results.len()); + for (i, (cpu, gpu)) in cpu_results.iter().zip(gpu_results.iter()).enumerate() { + assert_eq!( + cpu.into_affine(), + gpu.into_affine(), + "Batch MSM results differ for poly {i}" + ); + } + } + #[test] - fn test_msm_gpu_vs_cpu() { + fn test_msm_gpu_vs_cpu_g1() { for ell in [10, 12, 14] { let mut rng = rand_chacha::ChaCha20Rng::seed_from_u64(ell as u64); let n = 1 << ell; @@ -660,18 +701,22 @@ mod gpu_tests { let srs = HyperKZGSRS::setup(&mut rng, n); let (pk, _): (HyperKZGProverKey, HyperKZGVerifierKey) = srs.trim(n); - let cpu_result = msm::batch_poly_msm_cpu::(pk.g1_powers(), &[&poly]).unwrap(); - let gpu_result = - msm::batch_poly_msm_gpu_bn254::(pk.g1_powers(), &[&poly]).unwrap(); - - assert_eq!(cpu_result.len(), gpu_result.len()); - for (cpu, gpu) in cpu_result.iter().zip(gpu_result.iter()) { - assert_eq!( - cpu.into_affine(), - gpu.into_affine(), - "MSM results differ for ell={ell}" - ); - } + test_msm_gpu_vs_cpu_generic::(pk.g1_powers(), &poly, ell); + } + } + + #[test] + fn test_msm_gpu_vs_cpu_g2() { + for ell in [10, 12, 14] { + let mut rng = rand_chacha::ChaCha20Rng::seed_from_u64(ell as u64 + 1000); + let n = 1 << ell; + + let poly_raw = (0..n).map(|_| Fr::rand(&mut rng)).collect::>(); + let poly = DensePolynomial::from(poly_raw); + + let bases: Vec = (0..n).map(|_| G2Affine::rand(&mut rng)).collect(); + + test_msm_gpu_vs_cpu_generic::(&bases, &poly, ell); } } @@ -727,7 +772,7 @@ mod gpu_tests { } #[test] - fn test_batch_msm_gpu_vs_cpu() { + fn test_batch_msm_gpu_vs_cpu_g1() { let mut rng = rand_chacha::ChaCha20Rng::seed_from_u64(42); let ell = 12; let n = 1 << ell; @@ -743,19 +788,25 @@ mod gpu_tests { let srs = HyperKZGSRS::setup(&mut rng, n); let (pk, _): (HyperKZGProverKey, HyperKZGVerifierKey) = srs.trim(n); - let poly_refs: Vec<&DensePolynomial> = polys.iter().collect(); + test_batch_msm_gpu_vs_cpu_generic::(pk.g1_powers(), &polys); + } - let cpu_results = msm::batch_poly_msm_cpu::(pk.g1_powers(), &poly_refs).unwrap(); - let gpu_results = - msm::batch_poly_msm_gpu_bn254::(pk.g1_powers(), &poly_refs).unwrap(); + #[test] + fn test_batch_msm_gpu_vs_cpu_g2() { + let mut rng = rand_chacha::ChaCha20Rng::seed_from_u64(43); + let ell = 12; + let n = 1 << ell; + let num_polys = 5; - assert_eq!(cpu_results.len(), gpu_results.len()); - for (i, (cpu, gpu)) in cpu_results.iter().zip(gpu_results.iter()).enumerate() { - assert_eq!( - cpu.into_affine(), - gpu.into_affine(), - "Batch MSM results differ for poly {i}" - ); - } + let polys: Vec> = (0..num_polys) + .map(|_| { + let poly_raw = (0..n).map(|_| Fr::rand(&mut rng)).collect::>(); + DensePolynomial::from(poly_raw) + }) + .collect(); + + let bases: Vec = (0..n).map(|_| G2Affine::rand(&mut rng)).collect(); + + test_batch_msm_gpu_vs_cpu_generic::(&bases, &polys); } } diff --git a/dp-crypto/src/arkyper/msm.rs b/dp-crypto/src/arkyper/msm.rs index 4875d28..74640d5 100644 --- a/dp-crypto/src/arkyper/msm.rs +++ b/dp-crypto/src/arkyper/msm.rs @@ -1,6 +1,6 @@ use std::borrow::Borrow; -use ark_ec::{AffineRepr, CurveGroup, scalar_mul::variable_base::VariableBaseMSM}; +use ark_ec::{scalar_mul::variable_base::VariableBaseMSM, AffineRepr, CurveGroup}; use ark_ff::PrimeField; use ark_std::cfg_iter; #[cfg(feature = "parallel")] @@ -32,7 +32,9 @@ pub fn batch_poly_msm<'a, A: AffineRepr>( use std::any::TypeId; if TypeId::of::() == TypeId::of::() { - batch_poly_msm_gpu_bn254(g1_powers, polys) + batch_poly_msm_gpu_g1_bn254(g1_powers, polys) + } else if TypeId::of::() == TypeId::of::() { + batch_poly_msm_gpu_g2_bn254(g1_powers, polys) } else { batch_poly_msm_cpu(g1_powers, polys) } @@ -57,16 +59,16 @@ pub fn batch_poly_msm_cpu<'a, A: AffineRepr>( } #[cfg(any(feature = "cuda", feature = "opencl"))] -pub fn batch_poly_msm_gpu_bn254<'a, A: AffineRepr>( +pub fn batch_poly_msm_gpu_g1_bn254<'a, A: AffineRepr>( g1_powers: &[A], polys: &[impl Borrow>], ) -> anyhow::Result> { use std::sync::Arc; - use super::gpu_msm::{GPU_MSM, convert_bases_to_gpu, convert_scalars_to_bigint}; + use super::gpu_msm::{convert_g1_bases_to_gpu, convert_scalars_to_bigint, GPU_MSM_G1}; let bases: &[ark_bn254::G1Affine] = unsafe { std::mem::transmute(g1_powers) }; - let bases_gpu = Arc::new(convert_bases_to_gpu(bases)); + let bases_gpu = Arc::new(convert_g1_bases_to_gpu(bases)); let results: Vec = polys .iter() @@ -78,7 +80,43 @@ pub fn batch_poly_msm_gpu_bn254<'a, A: AffineRepr>( let bases_slice = Arc::new(bases_gpu[..msm_size].to_vec()); - let result: ark_bn254::G1Projective = GPU_MSM + let result: ark_bn254::G1Projective = GPU_MSM_G1 + .lock() + .unwrap() + .msm_arc(bases_slice, scalars_bigint) + .map_err(|e| anyhow::anyhow!("GPU MSM error: {e}"))?; + + let result_generic: A::Group = unsafe { std::mem::transmute_copy(&result) }; + Ok(result_generic) + }) + .collect::>>()?; + + Ok(results) +} + +#[cfg(any(feature = "cuda", feature = "opencl"))] +pub fn batch_poly_msm_gpu_g2_bn254<'a, A: AffineRepr>( + g2_powers: &[A], + polys: &[impl Borrow>], +) -> anyhow::Result> { + use std::sync::Arc; + + use super::gpu_msm::{convert_g2_bases_to_gpu, convert_scalars_to_bigint, GPU_MSM_G2}; + + let bases: &[ark_bn254::G2Affine] = unsafe { std::mem::transmute(g2_powers) }; + let bases_gpu = Arc::new(convert_g2_bases_to_gpu(bases)); + + let results: Vec = polys + .iter() + .map(|poly| { + let coeffs = poly.borrow().evals_ref(); + let scalars: &[ark_bn254::Fr] = unsafe { std::mem::transmute(coeffs) }; + let msm_size = scalars.len(); + let scalars_bigint = Arc::new(convert_scalars_to_bigint(&scalars[..msm_size])); + + let bases_slice = Arc::new(bases_gpu[..msm_size].to_vec()); + + let result: ark_bn254::G2Projective = GPU_MSM_G2 .lock() .unwrap() .msm_arc(bases_slice, scalars_bigint) From 9237d0715fc3db5c39bf09c8fbfbe22e40cbe7af Mon Sep 17 00:00:00 2001 From: Fedor Sakharov Date: Wed, 14 Jan 2026 20:34:23 +0100 Subject: [PATCH 08/10] fix build --- dp-crypto/src/arkyper/gpu_msm.rs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/dp-crypto/src/arkyper/gpu_msm.rs b/dp-crypto/src/arkyper/gpu_msm.rs index 9f9c78c..5ec2051 100644 --- a/dp-crypto/src/arkyper/gpu_msm.rs +++ b/dp-crypto/src/arkyper/gpu_msm.rs @@ -3,17 +3,12 @@ use std::sync::{Arc, Mutex}; use ark_bn254::{Fq, Fq2, Fr, G1Projective, G2Projective}; use ark_ec::AffineRepr; use ark_ff::PrimeField; -<<<<<<< HEAD -use ec_gpu_gen::{G1AffineM, MultiexpKernel, program, rust_gpu_tools::Device, threadpool::Worker}; + use rayon::prelude::*; -||||||| parent of 1a19569 (g2 also) -use ec_gpu_gen::{G1AffineM, MultiexpKernel, program, rust_gpu_tools::Device, threadpool::Worker}; -======= use ec_gpu::arkworks_bn254::{G1Affine, G2Affine}; use ec_gpu_gen::{ program, rust_gpu_tools::Device, threadpool::Worker, G1AffineM, G2AffineM, MultiexpKernel, }; ->>>>>>> 1a19569 (g2 also) pub static GPU_MSM_G1: std::sync::LazyLock> = std::sync::LazyLock::new(|| Mutex::new(GpuMsmG1::new().expect("Failed to initialize GPU MSM"))); From 33eb288e03544a30d35f9829f8918f69741778d7 Mon Sep 17 00:00:00 2001 From: Fedor Sakharov Date: Wed, 14 Jan 2026 20:40:20 +0100 Subject: [PATCH 09/10] fix build 2 --- dp-crypto/src/arkyper/gpu_msm.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/dp-crypto/src/arkyper/gpu_msm.rs b/dp-crypto/src/arkyper/gpu_msm.rs index 5ec2051..77842ea 100644 --- a/dp-crypto/src/arkyper/gpu_msm.rs +++ b/dp-crypto/src/arkyper/gpu_msm.rs @@ -4,11 +4,11 @@ use ark_bn254::{Fq, Fq2, Fr, G1Projective, G2Projective}; use ark_ec::AffineRepr; use ark_ff::PrimeField; -use rayon::prelude::*; use ec_gpu::arkworks_bn254::{G1Affine, G2Affine}; use ec_gpu_gen::{ program, rust_gpu_tools::Device, threadpool::Worker, G1AffineM, G2AffineM, MultiexpKernel, }; +use rayon::prelude::*; pub static GPU_MSM_G1: std::sync::LazyLock> = std::sync::LazyLock::new(|| Mutex::new(GpuMsmG1::new().expect("Failed to initialize GPU MSM"))); @@ -132,7 +132,6 @@ impl GpuMsmG2 { self.kernel .multiexp(&self.pool, bases, scalars, 0) .map_err(|e| anyhow::anyhow!("GPU MSM failed: {e}")) ->>>>>>> c9c471f (g2 also) } } From 70c14f4084812cf840b68e065b7eed775bc57c1f Mon Sep 17 00:00:00 2001 From: Fedor Sakharov Date: Wed, 14 Jan 2026 20:47:11 +0100 Subject: [PATCH 10/10] remove dead code --- dp-crypto/src/arkyper/gpu_msm.rs | 45 -------------------------------- 1 file changed, 45 deletions(-) diff --git a/dp-crypto/src/arkyper/gpu_msm.rs b/dp-crypto/src/arkyper/gpu_msm.rs index 77842ea..7bd0014 100644 --- a/dp-crypto/src/arkyper/gpu_msm.rs +++ b/dp-crypto/src/arkyper/gpu_msm.rs @@ -47,51 +47,6 @@ impl GpuMsmG1 { Ok(Self { kernel, pool }) } - pub fn new_single_device(device_index: usize) -> anyhow::Result { - let devices = Device::all(); - if devices.is_empty() { - return Err(anyhow::anyhow!("No GPU devices found")); - } - if device_index >= devices.len() { - return Err(anyhow::anyhow!( - "Device index {} out of range (available: {})", - device_index, - devices.len() - )); - } - - let device = &devices[device_index]; - let program = - program!(device).map_err(|e| anyhow::anyhow!("Failed to create GPU program: {e}"))?; - - let kernel = MultiexpKernel::create(vec![program], std::slice::from_ref(device)) - .map_err(|e| anyhow::anyhow!("Failed to create MSM kernel: {e}"))?; - - let pool = Worker::new(); - - Ok(Self { kernel, pool }) - } - - pub fn msm(&mut self, bases: &[G1Affine], scalars: &[Fr]) -> anyhow::Result { - if bases.len() != scalars.len() { - return Err(anyhow::anyhow!( - "bases and scalars must have the same length: {} != {}", - bases.len(), - scalars.len() - )); - } - - let bases_gpu = convert_bases_to_gpu(bases); - let exps = convert_scalars_to_bigint(scalars); - - let result = self - .kernel - .multiexp(&self.pool, Arc::new(bases_gpu), Arc::new(exps), 0) - .map_err(|e| anyhow::anyhow!("GPU MSM failed: {e}"))?; - - Ok(result) - } - pub fn msm_arc( &mut self, bases: Arc>,