Without a GPU (macOS), rc176's worker pool - 1/3 of the 12.9 GB budget on a 16 GB Mac - let only two
molecular-replacement placements run at once, as each reserved 32 B per grid point (2.1 GB on 4nwv)
against a measured ~0.95 GB. MR rescoring went from 38.6 s to 69 s and 4nwv's wall time from 402 s
(budget off) to 444 s.
On the M6 Mac mini (16 GB), 4nwv, two runs each in alternating order on a quiet machine:
- old build 234774ff0: 418.4 s, 20.0-21.3 GiB peak footprint, 576-682k swapouts
- rc176 as shipped: 444.2 s, 14.5-15.2 GiB, 39-66k swapouts
- this change: 402.4 s, 15.5-15.8 GiB, 66-93k swapouts
- budget switched off: 401.7 s, 21.8-23.3 GiB, 268-433k swapouts
9zlo/9s02/9gjx: 71.9/79.0/82.8 s (old build 73.6/82.2/83.6), no swap. p.hkl byte-identical in every
run: the pool decides only what runs at once.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018My7tqt8a4LyKKjP3FhScT
42 lines
2.4 KiB
C++
42 lines
2.4 KiB
C++
// SPDX-FileCopyrightText: 2026 Filip Leonarski, Paul Scherrer Institute <filip.leonarski@psi.ch>
|
|
// SPDX-License-Identifier: GPL-3.0-only
|
|
|
|
#pragma once
|
|
|
|
#include <cstddef>
|
|
#include <vector>
|
|
|
|
#include "gemmi/dencalc.hpp" // DensityCalculator
|
|
#include "gemmi/grid.hpp"
|
|
#include "gemmi/it92.hpp" // IT92 x-ray form factors
|
|
#include "gemmi/model.hpp"
|
|
|
|
// gemmi's gridding of a model - the density of DensityCalculator::put_model_density_on_grid() and the
|
|
// bulk-solvent mask of SolventMasker(AtomicRadiiSet::Refmac).put_mask_on_grid() - spread over
|
|
// `nthreads` threads of ParallelFor's pool. Every grid point receives the same operations in the same
|
|
// order as in gemmi's serial loops, so the grids are gemmi's, bit for bit, on any number of threads.
|
|
|
|
// The points gemmi's Grid::symmetrize() reduces the orbits of this grid's size and space group into
|
|
// (empty in P1). Both functions below take them, for a grid of the same size.
|
|
std::vector<size_t> OrbitLeaders(const gemmi::Grid<float> &grid, size_t nthreads);
|
|
|
|
// `dc` set up as for put_model_density_on_grid(): d_min, rate, blur, the grid's cell and group.
|
|
void PutModelDensityOnGrid(gemmi::DensityCalculator<gemmi::IT92<float>, float> &dc, const gemmi::Model &model,
|
|
const std::vector<size_t> &orbit_leaders, size_t nthreads);
|
|
|
|
// `grid` sized, with its cell and group set.
|
|
void PutMaskOnGrid(gemmi::Grid<float> &grid, const gemmi::Model &model, const std::vector<size_t> &orbit_leaders,
|
|
size_t nthreads);
|
|
|
|
// The number of points of the grid a model's structure factors to d_min are computed on at DensityCalculator's
|
|
// `rate` (a spacing of d_min / (2 rate)) in this cell and space group: the grid's size, without making it.
|
|
size_t ModelGridPoints(const gemmi::UnitCell &cell, const gemmi::SpaceGroup *sg, double d_min, double rate = 1.5);
|
|
|
|
// What computing a model's structure factors on the CPU holds at its peak, per point of that grid: the density
|
|
// and the bulk-solvent mask grids, and for each of them its transform's input copy, spectrum and coefficients,
|
|
// with the two made at once (ModelValidation's compute_model_factors).
|
|
constexpr size_t MODEL_FACTORS_BYTES_PER_GRID_POINT = 32;
|
|
// What a molecular-replacement placement's structure factors and rigid body hold on the CPU at their peak, per
|
|
// point of that grid: measured at under half of the above.
|
|
constexpr size_t MODEL_PLACEMENT_BYTES_PER_GRID_POINT = 16;
|