Skip to content

Commit 0ba5843

Browse files
committed
feat(fflonk): changes for better compression
1 parent 84be6f9 commit 0ba5843

File tree

4 files changed

+69
-9
lines changed

4 files changed

+69
-9
lines changed

crates/fflonk/src/context.rs

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ pub(crate) fn init_tmp_mempool() {
5555
unsafe {
5656
_TMP_MEMPOOL = Some(bc_mem_pool::new(DEFAULT_DEVICE_ID).unwrap());
5757
}
58-
let num_tmp_bytes = 1_100_000_000;
58+
let num_tmp_bytes = 3 << 29; //1.5GB
5959
let stream = bc_stream::new().unwrap();
6060
DVec::<u8, PoolAllocator>::allocate_on(num_tmp_bytes, _tmp_mempool(), stream);
6161
}
@@ -146,9 +146,19 @@ const POWERS_OF_COSET_OMEGA_COARSE_LOG_COUNT: u32 = 14;
146146
pub type DeviceContextWithSingleDevice = DeviceContext<1>;
147147

148148
impl<const N: usize> DeviceContext<N> {
149+
pub fn init_from_preloaded_crs(
150+
domain_size: usize,
151+
crs: Crs<CompactBn256, CrsForMonomialForm>,
152+
) -> CudaResult<Self> {
153+
let context = Self::init_no_msm(domain_size)?;
154+
Self::init_msm_on_static_memory(domain_size, Some(crs))?;
155+
156+
Ok(context)
157+
}
158+
149159
pub fn init(domain_size: usize) -> CudaResult<Self> {
150160
let context = Self::init_no_msm(domain_size)?;
151-
Self::init_msm_on_static_memory(domain_size)?;
161+
Self::init_msm_on_static_memory(domain_size, None)?;
152162
// Self::init_msm_on_pool(domain_size)?;
153163

154164
Ok(context)
@@ -179,22 +189,26 @@ impl<const N: usize> DeviceContext<N> {
179189
Ok(DeviceContext)
180190
}
181191

182-
fn init_msm_on_static_memory(domain_size: usize) -> CudaResult<()> {
183-
Self::inner_init_msm(domain_size, None, None)?;
192+
fn init_msm_on_static_memory(
193+
domain_size: usize,
194+
crs: Option<Crs<CompactBn256, CrsForMonomialForm>>,
195+
) -> CudaResult<()> {
196+
Self::inner_init_msm(domain_size, crs, None, None)?;
184197
Ok(())
185198
}
186199

187200
// In reality we keep bases on a statically allocated buffer.
188201
unsafe fn init_msm_on_pool(domain_size: usize) -> CudaResult<()> {
189202
let pool = _msm_bases_mempool();
190203
let stream = bc_stream::new().unwrap();
191-
Self::inner_init_msm(domain_size, Some(pool), Some(stream))?;
204+
Self::inner_init_msm(domain_size, None, Some(pool), Some(stream))?;
192205
stream.sync().unwrap();
193206
Ok(())
194207
}
195208

196209
fn inner_init_msm(
197210
domain_size: usize,
211+
crs: Option<Crs<CompactBn256, CrsForMonomialForm>>,
198212
pool: Option<bc_mem_pool>,
199213
stream: Option<bc_stream>,
200214
) -> CudaResult<()> {
@@ -205,7 +219,10 @@ impl<const N: usize> DeviceContext<N> {
205219
init_msm_result_mempool();
206220
// MSM impl requires bases to be located in a buffer that is
207221
// multiple of the domain_size
208-
let crs = init_compact_crs(&bellman::worker::Worker::new(), domain_size);
222+
let crs = match crs {
223+
Some(preloaded_crs) => preloaded_crs,
224+
None => init_compact_crs(&bellman::worker::Worker::new(), domain_size),
225+
};
209226
let num_bases = MAX_COMBINED_DEGREE_FACTOR * domain_size;
210227
assert!(crs.g1_bases.len() >= num_bases);
211228
let bases = match (pool, stream) {

crates/fflonk/src/convenience.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ use circuit_definitions::circuit_definitions::aux_layer::{
1414
};
1515
use fflonk::{FflonkAssembly, L1_VERIFIER_DOMAIN_SIZE_LOG};
1616

17-
pub type FflonkSnarkVerifierCircuitDeviceSetup =
18-
FflonkDeviceSetup<Bn256, FflonkSnarkVerifierCircuit>;
17+
pub type FflonkSnarkVerifierCircuitDeviceSetup<A> =
18+
FflonkDeviceSetup<Bn256, FflonkSnarkVerifierCircuit, A>;
1919

2020
use super::*;
2121

crates/fflonk/src/lib.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ pub use gpu_ffi;
6363
use gpu_ffi::{bc_event, bc_mem_pool, bc_stream};
6464
use std::alloc::Allocator;
6565

66-
pub use context::{DeviceContext, DeviceContextWithSingleDevice};
66+
pub use context::{init_compact_crs, DeviceContext, DeviceContextWithSingleDevice};
6767
pub use fflonk::MAX_COMBINED_DEGREE_FACTOR;
6868

6969
pub use convenience::FflonkSnarkVerifierCircuitDeviceSetup;
@@ -74,3 +74,5 @@ pub type FflonkSnarkVerifierCircuit = ZkSyncSnarkWrapperCircuitNoLookupCustomGat
7474
pub type FflonkSnarkVerifierCircuitVK = FflonkVerificationKey<Bn256, FflonkSnarkVerifierCircuit>;
7575
pub type FflonkSnarkVerifierCircuitProof = FflonkProof<Bn256, FflonkSnarkVerifierCircuit>;
7676
pub type FflonkSnarkVerifierCircuitSetup = FflonkSetup<Bn256, FflonkSnarkVerifierCircuit>;
77+
78+
pub use allocator::{GlobalHost, HostAllocator};

crates/fflonk/src/setup.rs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,3 +307,44 @@ impl<E: Engine, C: Circuit<E>, A: HostAllocator> FflonkDeviceSetup<E, C, A> {
307307
write_curve_affine(&self.g2_elems[1], writer)
308308
}
309309
}
310+
311+
pub fn read_raw_fr_vec<F: PrimeField, R: std::io::Read, A: Allocator + Default>(
312+
mut src: R,
313+
) -> std::io::Result<Vec<F, A>> {
314+
use byteorder::{BigEndian, ReadBytesExt};
315+
let num_values = src.read_u32::<BigEndian>()? as usize;
316+
let mut values = Vec::with_capacity_in(num_values, A::default());
317+
unsafe {
318+
values.set_len(num_values);
319+
let buf = std::slice::from_raw_parts_mut(
320+
values.as_mut_ptr() as *mut u8,
321+
num_values * std::mem::size_of::<F>(),
322+
);
323+
// src.read_exact(buf)?;
324+
let mut dst = &mut buf[..];
325+
std::io::copy(&mut src, &mut dst)?;
326+
}
327+
328+
Ok(values)
329+
}
330+
331+
pub fn write_raw_fr_slice<F: PrimeField, W: std::io::Write>(
332+
src_values: &[F],
333+
mut dst: W,
334+
) -> std::io::Result<()> {
335+
use byteorder::{BigEndian, WriteBytesExt};
336+
let num_values = src_values.len();
337+
assert!(num_values < u32::MAX as usize);
338+
dst.write_u32::<BigEndian>(num_values as u32)?;
339+
unsafe {
340+
let buf = std::slice::from_raw_parts_mut(
341+
src_values.as_ptr() as *mut u8,
342+
num_values * std::mem::size_of::<F>(),
343+
);
344+
let mut reader = &buf[..];
345+
// dst.write_all(buf)?;
346+
std::io::copy(&mut reader, &mut dst)?;
347+
}
348+
349+
Ok(())
350+
}

0 commit comments

Comments
 (0)