Skip to content

Commit 1c25397

Browse files
committed
Minor incremental sorting perf optimisations
1 parent 0d0a223 commit 1c25397

File tree

8 files changed

+69
-23
lines changed

8 files changed

+69
-23
lines changed

necsim/impls/no-std/src/parallelisation/independent/monolithic/reporter/live.rs

Lines changed: 55 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use necsim_partitioning_core::LocalPartition;
1212

1313
use super::WaterLevelReporterProxy;
1414

15-
#[derive(Clone, Copy)]
15+
#[derive(Clone, Copy, Debug)]
1616
struct Run {
1717
start: usize,
1818
len: usize,
@@ -49,6 +49,7 @@ impl<'l, 'p, R: Reporter, P: LocalPartition<'p, R>> fmt::Debug
4949
.field("water_level", &self.water_level)
5050
.field("runs", &self.runs.len())
5151
.field("overflow", &self.overflow.len())
52+
.field("run", &self.run)
5253
.field("slow_events", &EventBufferLen(self.slow_events.len()))
5354
.field("fast_events", &EventBufferLen(self.fast_events.len()))
5455
.finish()
@@ -319,17 +320,35 @@ impl<'l, 'p, R: Reporter, P: LocalPartition<'p, R>> WaterLevelReporterProxy<'l,
319320
}
320321

321322
fn advance_water_level(&mut self, water_level: NonNegativeF64) {
322-
let mut i = 0;
323+
info!("{:?}", self);
324+
325+
if self.run.len > 0 {
326+
let last_run = core::mem::replace(
327+
&mut self.run,
328+
Run {
329+
start: self.slow_events.len(),
330+
len: 0,
331+
},
332+
);
333+
self.overflow.push_back(last_run);
334+
}
335+
336+
if let (Some(Run { start, .. }), Some(Run { start: middle, len })) = (
337+
self.overflow.front().copied(),
338+
self.overflow.back().copied(),
339+
) {
340+
self.slow_events[start..middle + len].sort_unstable();
341+
self.overflow.clear();
342+
self.runs.push(Run {
343+
start,
344+
len: middle + len - start,
345+
});
346+
}
323347

324348
// Report all events below the water level in sorted order
325349
// TODO: Should we detect if no partial sort steps were taken
326350
// and revert to a full unstable sort in that case?
327-
while let ControlFlow::Continue(()) = self.sort_slow_events_step(true) {
328-
if (i % 100) == 0 {
329-
info!("{:?}", self);
330-
}
331-
i += 1;
332-
}
351+
while let ControlFlow::Continue(()) = self.sort_slow_events_step(true) {}
333352

334353
debug_assert!(self.slow_events.is_sorted());
335354

@@ -387,6 +406,31 @@ impl<'l, 'p, R: Reporter, P: LocalPartition<'p, R>> Drop
387406
for LiveWaterLevelReporterProxy<'l, 'p, R, P>
388407
{
389408
fn drop(&mut self) {
409+
info!("{:?}", self);
410+
411+
if self.run.len > 0 {
412+
let last_run = core::mem::replace(
413+
&mut self.run,
414+
Run {
415+
start: self.slow_events.len(),
416+
len: 0,
417+
},
418+
);
419+
self.overflow.push_back(last_run);
420+
}
421+
422+
if let (Some(Run { start, .. }), Some(Run { start: middle, len })) = (
423+
self.overflow.front().copied(),
424+
self.overflow.back().copied(),
425+
) {
426+
self.slow_events[start..middle + len].sort_unstable();
427+
self.overflow.clear();
428+
self.runs.push(Run {
429+
start,
430+
len: middle + len - start,
431+
});
432+
}
433+
390434
// Report all events below the water level in sorted order
391435
while let ControlFlow::Continue(()) = self.sort_slow_events_step(true) {}
392436

@@ -411,7 +455,7 @@ impl<'l, 'p, R: Reporter, P: LocalPartition<'p, R>> Drop
411455
self.run = Run { start: 0, len: 0 };
412456

413457
// Report all events above the water level in sorted order
414-
self.fast_events.sort();
458+
self.fast_events.sort_unstable();
415459

416460
for event in self.fast_events.drain(..) {
417461
match event.into() {
@@ -427,5 +471,7 @@ impl<'l, 'p, R: Reporter, P: LocalPartition<'p, R>> Drop
427471
},
428472
}
429473
}
474+
475+
info!("{:?}", self);
430476
}
431477
}

necsim/impls/no-std/src/parallelisation/monolithic/optimistic.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ pub fn simulate<
135135
));
136136
}
137137

138-
immigrants.sort();
138+
immigrants.sort_unstable();
139139

140140
// A global rollback is required if at least one partition received unexpected
141141
// immigration

necsim/impls/std/src/event_log/recorder.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ impl EventLogRecorder {
177177
}
178178

179179
fn sort_and_write_segment(&mut self) -> Result<()> {
180-
self.buffer.sort();
180+
self.buffer.sort_unstable();
181181

182182
let segment_path = self.directory.join(format!("{}", self.segment_index));
183183
self.segment_index += 1;

necsim/impls/std/src/event_log/replay/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ impl Serialize for EventLogReplay {
4343
}
4444
}
4545

46-
segments.sort();
46+
segments.sort_unstable();
4747

4848
EventLog { segments, capacity }.serialize(serializer)
4949
}

rustcoalescence/algorithms/gillespie/src/event_skipping/initialiser/fixup.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ where
199199
);
200200
},
201201
CoalescenceStrategy::Coalescence => {
202-
coalescence.sort();
202+
coalescence.sort_unstable();
203203

204204
for (coalescing_lineage, parent) in coalescence {
205205
local_partition.get_reporter().report_dispersal(
@@ -244,7 +244,7 @@ where
244244
return Err(ResumeError::Sample(exceptional_lineages));
245245
}
246246

247-
fixable_lineages.sort();
247+
fixable_lineages.sort_unstable();
248248

249249
let active_lineage_sampler = RestartFixUpActiveLineageSampler::new(
250250
active_lineage_sampler,

rustcoalescence/algorithms/gillespie/src/gillespie/classical/initialiser/fixup.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ impl<
151151
);
152152
},
153153
CoalescenceStrategy::Coalescence => {
154-
coalescence.sort();
154+
coalescence.sort_unstable();
155155

156156
for (coalescing_lineage, parent) in coalescence {
157157
local_partition.get_reporter().report_dispersal(
@@ -196,7 +196,7 @@ impl<
196196
return Err(ResumeError::Sample(exceptional_lineages));
197197
}
198198

199-
fixable_lineages.sort();
199+
fixable_lineages.sort_unstable();
200200

201201
let dispersal_sampler = TrespassingDispersalSampler::new(
202202
dispersal_sampler,

rustcoalescence/algorithms/gillespie/src/gillespie/turnover/initialiser/fixup.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ impl<
173173
);
174174
},
175175
CoalescenceStrategy::Coalescence => {
176-
coalescence.sort();
176+
coalescence.sort_unstable();
177177

178178
for (coalescing_lineage, parent) in coalescence {
179179
local_partition.get_reporter().report_dispersal(
@@ -218,7 +218,7 @@ impl<
218218
return Err(ResumeError::Sample(exceptional_lineages));
219219
}
220220

221-
fixable_lineages.sort();
221+
fixable_lineages.sort_unstable();
222222

223223
let dispersal_sampler = TrespassingDispersalSampler::new(
224224
dispersal_sampler,

simulate.ron

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
(
2-
speciation: 0.1,
2+
speciation: 0.0001,
33
sample: Sample(percentage: 1.0),
4-
rng: Entropy,
4+
rng: Seed(42),
55

6-
algorithm: EventSkipping(),
6+
algorithm: CUDA(step_slice: 150, block_size: 64, grid_size: 128, sort_block_size: 512, sort_mode: None, sort_batch_size: 3500),
77

88
scenario: NonSpatial(
99
area: (100, 100),
10-
deme: 100,
10+
deme: 1000,
1111
),
1212

1313
reporters: [
1414
Plugin(
1515
library: "target/release/deps/libnecsim_plugins_common.so",
16-
reporters: [Biodiversity(), Execution(), Progress()],
16+
reporters: [Biodiversity(), Execution(), Progress(), Counter()],
1717
),
1818
],
1919
)

0 commit comments

Comments
 (0)