@@ -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;
146146pub type DeviceContextWithSingleDevice = DeviceContext < 1 > ;
147147
148148impl < 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) {
0 commit comments