87c70195f8a74c8b088063adf5b188e47999ad10
Profiling showed the per-space-group "group hkl" step (~0.30s/2-pass on lyso) is not gemmi-bound (the ASU keying is ~6ms) but memory-bandwidth-bound: stamping the group id onto, and reading it back from, the `group` field scattered across the 56-byte Obs struct touches the whole ~350MB partials array twice per pass. Precompute the per-obs AcceptReflection finiteness once (immutable) into a flat 1-byte array, then stamp the ASU-group id from rawrun_group + that flat array into a flat group_ids vector for the GPU, and build the group CSR (a stable counting sort, now parallel) from group_ids - all sequential/flat reads. The Obs.group field is written only when a CPU stage will read it (no GPU: scaling/CC/combine otherwise use group_ids / rawrun_group, never partials.group), so the default path skips the strided Obs pass entirely. group hkl ~0.31 -> ~0.20 s/2-pass on lyso. Output is bit-identical (group_ids values and the obs-index-ordered gperm are unchanged), so the merged results are unchanged; validated across the battery (15/15 deterministic crystals bit-identical to the CPU path, only EP_cs_01-24 noise keeps its benign wobble). Non-CUDA build unaffected (need_obs_group is always true there). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
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++
73.7%
HTML
8.8%
C
7%
TypeScript
4.8%
Tcl
2.5%
Other
3.1%