Skip to content

Commit 58e6bfd

Browse files
committed
skip energy recomputation during warmup, pre-allocate measurement buffers
1 parent 24dede4 commit 58e6bfd

File tree

1 file changed

+55
-46
lines changed

1 file changed

+55
-46
lines changed

spin-sim/src/simulation.rs

Lines changed: 55 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,14 @@ pub fn run_sweep_loop(
203203
let mut overlap2_stat = Statistics::new(n_temps, 1);
204204
let mut overlap4_stat = Statistics::new(n_temps, 1);
205205

206+
let mut mags_buf = vec![0.0f32; n_temps];
207+
let mut mags2_buf = vec![0.0f32; n_temps];
208+
let mut mags4_buf = vec![0.0f32; n_temps];
209+
let mut energies_buf = vec![0.0f32; n_temps];
210+
let mut overlaps_buf = vec![0.0f32; n_temps];
211+
let mut overlaps2_buf = vec![0.0f32; n_temps];
212+
let mut overlaps4_buf = vec![0.0f32; n_temps];
213+
206214
for sweep_id in 0..n_sweeps {
207215
if interrupted.load(Ordering::Relaxed) {
208216
return Err("interrupted".to_string());
@@ -265,15 +273,13 @@ pub fn run_sweep_loop(
265273
}
266274
}
267275
}
276+
}
268277

269-
(real.energies, _) = spins::energy::compute_energies(
270-
lattice,
271-
&real.spins,
272-
&real.couplings,
273-
n_systems,
274-
false,
275-
);
276-
} else {
278+
let pt_this_sweep = config
279+
.pt_interval
280+
.is_some_and(|interval| sweep_id % interval == 0);
281+
282+
if record || pt_this_sweep {
277283
(real.energies, _) = spins::energy::compute_energies(
278284
lattice,
279285
&real.spins,
@@ -284,10 +290,12 @@ pub fn run_sweep_loop(
284290
}
285291

286292
if record {
287-
let mut mags = vec![0.0f32; n_temps];
288-
let mut mags2 = vec![0.0f32; n_temps];
289-
let mut mags4 = vec![0.0f32; n_temps];
290-
let mut energies_ordered = vec![0.0f32; n_temps];
293+
for t in 0..n_temps {
294+
mags_buf[t] = 0.0;
295+
mags2_buf[t] = 0.0;
296+
mags4_buf[t] = 0.0;
297+
energies_buf[t] = 0.0;
298+
}
291299

292300
for r in 0..n_replicas {
293301
let offset = r * n_temps;
@@ -300,25 +308,27 @@ pub fn run_sweep_loop(
300308
}
301309
let mag = sum as f32 / n_spins as f32;
302310
let m2 = mag * mag;
303-
mags[t] = mag;
304-
mags2[t] = m2;
305-
mags4[t] = m2 * m2;
306-
energies_ordered[t] = real.energies[system_id];
311+
mags_buf[t] = mag;
312+
mags2_buf[t] = m2;
313+
mags4_buf[t] = m2 * m2;
314+
energies_buf[t] = real.energies[system_id];
307315
}
308316

309-
mags_stat.update(&mags);
310-
mags2_stat.update(&mags2);
311-
mags4_stat.update(&mags4);
312-
energies_stat.update(&energies_ordered);
313-
energies2_stat.update(&energies_ordered);
317+
mags_stat.update(&mags_buf);
318+
mags2_stat.update(&mags2_buf);
319+
mags4_stat.update(&mags4_buf);
320+
energies_stat.update(&energies_buf);
321+
energies2_stat.update(&energies_buf);
314322
}
315323

316324
for pair_idx in 0..n_pairs {
317325
let r_a = 2 * pair_idx;
318326
let r_b = 2 * pair_idx + 1;
319-
let mut overlaps = vec![0.0f32; n_temps];
320-
let mut overlaps2 = vec![0.0f32; n_temps];
321-
let mut overlaps4 = vec![0.0f32; n_temps];
327+
for t in 0..n_temps {
328+
overlaps_buf[t] = 0.0;
329+
overlaps2_buf[t] = 0.0;
330+
overlaps4_buf[t] = 0.0;
331+
}
322332

323333
for t in 0..n_temps {
324334
let sys_a = real.system_ids[r_a * n_temps + t];
@@ -331,14 +341,14 @@ pub fn run_sweep_loop(
331341
}
332342
let q = dot as f32 / n_spins as f32;
333343
let q2 = q * q;
334-
overlaps[t] = q;
335-
overlaps2[t] = q2;
336-
overlaps4[t] = q2 * q2;
344+
overlaps_buf[t] = q;
345+
overlaps2_buf[t] = q2;
346+
overlaps4_buf[t] = q2 * q2;
337347
}
338348

339-
overlap_stat.update(&overlaps);
340-
overlap2_stat.update(&overlaps2);
341-
overlap4_stat.update(&overlaps4);
349+
overlap_stat.update(&overlaps_buf);
350+
overlap2_stat.update(&overlaps2_buf);
351+
overlap4_stat.update(&overlaps4_buf);
342352
}
343353
}
344354

@@ -399,7 +409,11 @@ pub fn run_sweep_loop(
399409
}
400410
top4_n += 1;
401411
}
412+
}
413+
}
402414

415+
if pt_this_sweep {
416+
if config.overlap_cluster.is_some() {
403417
(real.energies, _) = spins::energy::compute_energies(
404418
lattice,
405419
&real.spins,
@@ -408,22 +422,17 @@ pub fn run_sweep_loop(
408422
false,
409423
);
410424
}
411-
}
412-
413-
if let Some(interval) = config.pt_interval {
414-
if sweep_id % interval == 0 {
415-
for r in 0..n_replicas {
416-
let offset = r * n_temps;
417-
let sid_slice = &mut real.system_ids[offset..offset + n_temps];
418-
let temp_slice = &real.temperatures[offset..offset + n_temps];
419-
mcmc::tempering::parallel_tempering(
420-
&real.energies,
421-
temp_slice,
422-
sid_slice,
423-
n_spins,
424-
&mut real.rngs[offset],
425-
);
426-
}
425+
for r in 0..n_replicas {
426+
let offset = r * n_temps;
427+
let sid_slice = &mut real.system_ids[offset..offset + n_temps];
428+
let temp_slice = &real.temperatures[offset..offset + n_temps];
429+
mcmc::tempering::parallel_tempering(
430+
&real.energies,
431+
temp_slice,
432+
sid_slice,
433+
n_spins,
434+
&mut real.rngs[offset],
435+
);
427436
}
428437
}
429438
}

0 commit comments

Comments
 (0)