Files
Jungfraujoch/docs
leonarski_fandClaude Opus 5 53a8c428c3 model: run the null's replicates at once
The replicates are independent by construction - the same model under a
different random rotation, scored the same way, nothing flowing between
them - so each takes a copy of the model and of its structure factors and
they run concurrently on the run's own -N budget. The real model is not
moved by any of them, which also drops the save/restore/recompute the
serial loop needed to put it back.

Measured on an idle machine, decision-pending --mode scale --model:
the null 10.0 s -> 2.5 s (median of 5), the whole run 13.9 s -> 6.5 s.
The speedup saturates at 4.0x, not 5x, because the replicates cost
1.58-2.31 s each (how many placement evaluations an orientation needs)
and the null now costs the slowest one; sum/max on the serial run is
4.13x, so 97% of what is there to get. More threads than replicates buy
nothing.

The rotations are drawn up front, in order, from the same fixed seed, so
replicate i gets the same orientation whatever order the threads run in.
A verdict that depended on the interleaving would not be a measurement.
Verified: every reflection file, map, map-MTZ and report is byte-identical
to the serial build's, on the accepted, both rejected and both no-decision
cases, and identical again with -N 1.

Thread safety was read out of the vendored gemmi source, not assumed. Each
replicate owns its DensityCalculator, SolventMasker, Scaling and Structure;
their statics are the const IT92 tables (constant-initialised, never
written on these paths), pocketfft is built with POCKETFFT_CACHE_SIZE 0 and
POCKETFFT_NO_MULTITHREADING so it holds no plan store, Scaling's
Levenberg-Marquardt is stack-local per call, and nothing on these paths
writes into the Structure it was handed. Ceres defaults num_threads to 1,
so the rigid-body solve adds no threads of its own.

Peak RSS is unchanged - the merge, not the null, is the high-water mark.
Five concurrent replicates add 83 MB over the serial null on a 78x78x37 A
cell at 1.56 A, ~17 MB each, which is the two grids at d_min/(2*rate).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EFEJG6WBQv8th4UJFNe53N
2026-09-02 14:41:28 +02:00
..
2026-08-13 17:03:10 +02:00
2026-08-13 17:03:10 +02:00
2025-04-14 11:52:06 +02:00
2024-11-22 21:25:20 +01:00
2026-02-18 16:17:21 +01:00
2026-08-26 22:47:00 +02:00
2024-11-17 14:55:09 +01:00
2026-08-13 17:03:10 +02:00
2024-11-17 14:55:09 +01:00
2026-08-27 22:16:54 +02:00
2026-08-13 17:03:10 +02:00
2026-08-13 17:03:10 +02:00
2025-11-28 12:47:35 +01:00
2026-06-23 20:29:49 +02:00
2026-07-11 07:19:11 +02:00
2024-12-02 21:17:14 +01:00
2024-12-02 21:17:14 +01:00
2026-08-13 17:03:10 +02:00
2026-08-26 22:47:00 +02:00
2026-08-26 22:47:00 +02:00
2024-11-22 21:25:20 +01:00
2026-08-25 08:21:39 +02:00
2026-08-25 08:21:39 +02:00
2026-08-26 22:47:00 +02:00
2026-08-31 09:11:22 +02:00
2024-11-17 14:55:09 +01:00
2024-11-22 21:25:20 +01:00