Skip to content

Commit 00ebc2e

Browse files
committed
chore(fflonk): allocator feature
1 parent 64923f3 commit 00ebc2e

File tree

4 files changed

+28
-28
lines changed

4 files changed

+28
-28
lines changed

crates/fflonk/Cargo.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ description = "CUDA implementation of the fflonk prover"
1212
exclude = ["/data"]
1313

1414
[dependencies]
15-
fflonk-cpu = {workspace = true}
15+
fflonk-cpu = {workspace = true, optional = true}
1616
circuit_definitions.workspace = true
1717
gpu-ffi.workspace = true
1818
rand = "0.4"
@@ -24,5 +24,6 @@ serde_json = "1"
2424
serde_derive = "1"
2525

2626
[features]
27-
default = []
27+
default = ["fflonk-cpu"]
2828
sanity = []
29+
allocator = ["fflonk-cpu/allocator"]

crates/fflonk/src/convenience.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use bellman::{
33
kate_commitment::{Crs, CrsForMonomialForm},
44
plonk::{
55
better_better_cs::cs::{
6-
Circuit, SynthesisModeGenerateSetup, SynthesisModeProve, SynthesisModeTesting,
6+
Circuit, SynthesisModeProve, SynthesisModeTesting,
77
},
88
commitments::transcript::keccak_transcript::RollingKeccakTranscript,
99
},
@@ -14,7 +14,7 @@ use circuit_definitions::circuit_definitions::aux_layer::{
1414
};
1515
use fflonk::{FflonkAssembly, L1_VERIFIER_DOMAIN_SIZE_LOG};
1616

17-
pub type FflonkSnarkVerifierCircuitDeviceSetup<A> =
17+
pub type FflonkSnarkVerifierCircuitDeviceSetup<A: HostAllocator = GlobalHost> =
1818
FflonkDeviceSetup<Bn256, FflonkSnarkVerifierCircuit, A>;
1919

2020
use super::*;
@@ -190,7 +190,7 @@ pub fn precompute_and_save_setup_and_vk_for_fflonk_snark_circuit(
190190

191191
println!("Generating fflonk setup data on the device");
192192
let device_setup =
193-
FflonkSnarkVerifierCircuitDeviceSetup::create_setup_on_device(&circuit).unwrap();
193+
FflonkSnarkVerifierCircuitDeviceSetup::<GlobalHost>::create_setup_on_device(&circuit).unwrap();
194194
let setup_file_path = format!("{}/final_snark_device_setup.bin", path);
195195
println!("Saving setup into file {setup_file_path}");
196196
let device_setup_file = std::fs::File::create(&setup_file_path).unwrap();

crates/fflonk/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,4 +75,4 @@ pub type FflonkSnarkVerifierCircuitVK = FflonkVerificationKey<Bn256, FflonkSnark
7575
pub type FflonkSnarkVerifierCircuitProof = FflonkProof<Bn256, FflonkSnarkVerifierCircuit>;
7676
pub type FflonkSnarkVerifierCircuitSetup = FflonkSetup<Bn256, FflonkSnarkVerifierCircuit>;
7777

78-
pub use allocator::{GlobalHost, HostAllocator};
78+
pub use allocator::{HostAllocator, GlobalHost};

crates/fflonk/src/setup.rs

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -254,25 +254,24 @@ impl<E: Engine, C: Circuit<E>, A: HostAllocator> FflonkDeviceSetup<E, C, A> {
254254
assert_eq!(num_polys, 5);
255255
let mut main_gate_selector_monomials = vec![];
256256
for _ in 0..num_polys {
257-
let num_values = reader.read_u64::<BigEndian>()?;
258-
let mut coeffs = Vec::with_capacity_in(num_values as usize, A::default());
259-
for _ in 0..num_values {
260-
let el = read_fr(&mut reader)?;
261-
coeffs.push(el);
262-
}
257+
let coeffs = read_raw_fr_vec::<_, _, A>(&mut reader)?;
263258
main_gate_selector_monomials.push(coeffs);
264259
}
265260

266261
let num_polys = reader.read_u64::<BigEndian>()?;
267262
assert_eq!(num_polys, 3);
268263
let mut variable_indexes = vec![];
269264
for _ in 0..num_polys {
270-
let num_values = reader.read_u64::<BigEndian>()?;
271-
let mut indexes = Vec::with_capacity_in(num_values as usize, A::default());
272-
for _ in 0..num_values {
273-
let el = reader.read_u32::<BigEndian>()?;
274-
indexes.push(el);
275-
}
265+
let num_values = reader.read_u64::<BigEndian>()? as usize;
266+
let mut indexes = Vec::with_capacity_in(num_values, A::default());
267+
let indexes_buf = unsafe {
268+
indexes.set_len(num_values);
269+
std::slice::from_raw_parts_mut(
270+
indexes.as_mut_ptr() as *mut u8,
271+
num_values * std::mem::size_of::<u32>(),
272+
)
273+
};
274+
reader.read_exact(indexes_buf)?;
276275
variable_indexes.push(indexes);
277276
}
278277

@@ -293,14 +292,18 @@ impl<E: Engine, C: Circuit<E>, A: HostAllocator> FflonkDeviceSetup<E, C, A> {
293292
use byteorder::{BigEndian, WriteBytesExt};
294293
writer.write_u64::<BigEndian>(self.main_gate_selector_monomials.len() as u64)?;
295294
for mon in self.main_gate_selector_monomials.iter() {
296-
write_fr_vec(&mon, &mut writer)?;
295+
write_raw_fr_slice(&mon, &mut writer)?;
297296
}
298297
writer.write_u64::<BigEndian>(self.variable_indexes.len() as u64)?;
299298
for col in self.variable_indexes.iter() {
300299
writer.write_u64::<BigEndian>(col.len() as u64)?;
301-
for el in col {
302-
writer.write_u32::<BigEndian>(*el)?;
303-
}
300+
let buf = unsafe {
301+
std::slice::from_raw_parts(
302+
col.as_ptr() as *mut u8,
303+
col.len() * std::mem::size_of::<u32>(),
304+
)
305+
};
306+
writer.write_all(buf)?;
304307
}
305308
write_curve_affine(&self.c0_commitment, &mut writer)?;
306309
write_curve_affine(&self.g2_elems[0], &mut writer)?;
@@ -320,9 +323,7 @@ pub fn read_raw_fr_vec<F: PrimeField, R: std::io::Read, A: Allocator + Default>(
320323
values.as_mut_ptr() as *mut u8,
321324
num_values * std::mem::size_of::<F>(),
322325
);
323-
// src.read_exact(buf)?;
324-
let mut dst = &mut buf[..];
325-
std::io::copy(&mut src, &mut dst)?;
326+
src.read_exact(buf)?;
326327
}
327328

328329
Ok(values)
@@ -341,9 +342,7 @@ pub fn write_raw_fr_slice<F: PrimeField, W: std::io::Write>(
341342
src_values.as_ptr() as *mut u8,
342343
num_values * std::mem::size_of::<F>(),
343344
);
344-
let mut reader = &buf[..];
345-
// dst.write_all(buf)?;
346-
std::io::copy(&mut reader, &mut dst)?;
345+
dst.write_all(buf)?;
347346
}
348347

349348
Ok(())

0 commit comments

Comments
 (0)