9a50ae5a0f7789474cd906733ddae001e4fa95f2
Five costs in the merge, none of them arithmetic. The strong-reflection asymptote was estimated twice for every merge and the first estimate was read by nothing: no statement between the two touches the value, so wherever the resolution cutoff refits the error model the earlier one was thrown away. It is now taken once, at the point the number is reported. Its per-group scatter array was also built fresh on every call - fifty megabytes value-initialised on one thread and immediately overwritten - and now lives with the object. The merge accumulator did the same thing on a larger scale: ten arrays and a struct of accumulators, a quarter of a gigabyte in all, zeroed on one thread before the device wrote every element of them. The kernel is a grid-stride loop over all groups and writes all ten outputs unconditionally, so nothing was reading a zero it had put there. The arrays are kept and resized, and the unpack that follows runs over the cores instead of one; its only reduction is an integer count, which does not care in what order it is summed. The host path still clears, because it accumulates in place. Dropping collapsed frame scales walked every full at eighty bytes a record to read two fields of four. Both were already downloaded, so it reads those instead: a tenth of the traffic for the same answer. The error model's chi-square median was computed on every fit and printed once. It now keeps what the last fit used and takes the median where the line is written. Counting the reflections a resolution shell could hold walked the whole reciprocal box on one thread and built a vector of the survivors first. The walk is now split over the outer index with a per-thread tally summed in thread order, and the vector is gone. On the cells in the rotation test set that is four to eleven milliseconds a call against three calls a crystal; on a two hundred Angstrom cell it is ninety-three milliseconds down to five. A comment claiming the point-group pass is serial to fill the operator cache is no longer true and is corrected; the cache is filled by a parallel pass before it. Every reflection file is byte-identical on four crystals, under a pinned resolution limit and under the automatic cutoff - the latter being the configuration that actually exercises the moved asymptote, since a pinned limit never made the second call at all. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EGpGdgmJ8MyY9pCGWjktyi
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++
75%
HTML
7.8%
C
6.2%
TypeScript
4.3%
Cuda
2.3%
Other
4.3%