aca2b2fdc3d23050d0e949707eae27af4bb92d17
Building each reflection's Gaussian profile was a third of the CPU pass B's samples (cytochrome C), one scalar BraggExp per cell. BraggExp branched to its two ends before the arithmetic, and the branches - with GCC's -ftrapping-math, which forbids running float arithmetic on a path that does not need it - kept every loop over it scalar. It now tells the ends apart on the bits of x, an integer comparison, runs the same arithmetic on x (or on 0 out of range) and masks the result: the same bits for every float but NaN, checked over all 2^32 inputs against the old function, scalar and vectorised. The cells are filled a row at a time and summed afterwards in the same order, so the loop vectorises (8 lanes, AVX2) and the profile is unchanged. BraggScale2 chooses its operands instead of a branch; scaling by 1 is exact. The Metal kernel shares the header and gets the same arithmetic. cytochrome C --no-gpu: p.hkl and MTZ data identical; user cycles -7% against the previous commit on the same (loaded, load 16-32) machine. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
battery.py timing: a three-set benchmark placed by molecular replacement, checked and timed per step
battery.py timing: a three-set benchmark placed by molecular replacement, checked and timed per step
battery.py timing: a three-set benchmark placed by molecular replacement, checked and timed per step
battery.py timing: a three-set benchmark placed by molecular replacement, checked and timed per step
Jungfraujoch
Application to receive and analyse data from the PSI JUNGFRAU and EIGER detectors, together with
rugnux, its program for processing stored diffraction data - rotation and serial, macromolecular
and small-molecule - from images to merged reflections.
All documentation is now placed in docs/ subdirectory and for the current version hosted on Jungfraujoch Read The Docs page.
Languages
C++
77.8%
HTML
5.5%
C
4.3%
Cuda
4%
TypeScript
3.2%
Other
5.1%