53a8c428c350b704af831a4a3c8e4fde8373fa6b
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
Jungfraujoch
Application to receive data from the PSI JUNGFRAU and EIGER detectors.
All documentation is now placed in docs/ subdirectory and for the current version hosted on Jungfraujoch Read The Docs page.
Languages
C++
76.7%
HTML
7.2%
C
5.6%
TypeScript
4%
Cuda
2.1%
Other
4.3%