From: Berk Hess Date: Wed, 23 Oct 2019 09:00:24 +0000 (+0200) Subject: Use gmx::Range in Nbnxm gridding functions X-Git-Url: http://biod.pnpi.spb.ru/gitweb/?a=commitdiff_plain;h=ecc68328eb6c0c58fb6eeefe5da66023cc7839bc;p=alexxy%2Fgromacs.git Use gmx::Range in Nbnxm gridding functions Change-Id: Ice818946dc78375065797056762acd340921ea70 --- diff --git a/src/gromacs/domdec/partition.cpp b/src/gromacs/domdec/partition.cpp index 918f57c915..8282b239dc 100644 --- a/src/gromacs/domdec/partition.cpp +++ b/src/gromacs/domdec/partition.cpp @@ -3052,7 +3052,7 @@ void dd_partition_system(FILE *fplog, comm->zones.size[0].bb_x0, comm->zones.size[0].bb_x1, comm->updateGroupsCog.get(), - 0, dd->ncg_home, + { 0, dd->ncg_home }, comm->zones.dens_zone0, fr->cginfo, state_local->x, diff --git a/src/gromacs/mdlib/sim_util.cpp b/src/gromacs/mdlib/sim_util.cpp index 6d2ad7048e..e50cc4f919 100644 --- a/src/gromacs/mdlib/sim_util.cpp +++ b/src/gromacs/mdlib/sim_util.cpp @@ -1080,7 +1080,7 @@ void do_force(FILE *fplog, wallcycle_sub_start(wcycle, ewcsNBS_GRID_LOCAL); nbnxn_put_on_grid(nbv, box, 0, vzero, box_diag, - nullptr, 0, mdatoms->homenr, -1, + nullptr, { 0, mdatoms->homenr }, -1, fr->cginfo, x.unpaddedArrayRef(), 0, nullptr); wallcycle_sub_stop(wcycle, ewcsNBS_GRID_LOCAL); diff --git a/src/gromacs/mdrun/tpi.cpp b/src/gromacs/mdrun/tpi.cpp index 46b185a128..c0db5dd992 100644 --- a/src/gromacs/mdrun/tpi.cpp +++ b/src/gromacs/mdrun/tpi.cpp @@ -587,7 +587,7 @@ LegacySimulator::do_tpi() rvec boxDiagonal = { box[XX][XX], box[YY][YY], box[ZZ][ZZ] }; nbnxn_put_on_grid(fr->nbv.get(), box, 0, vzero, boxDiagonal, - nullptr, 0, a_tp0, -1, + nullptr, { 0, a_tp0 }, -1, fr->cginfo, x, 0, nullptr); @@ -662,7 +662,7 @@ LegacySimulator::do_tpi() /* Put the inserted molecule on it's own search grid */ nbnxn_put_on_grid(fr->nbv.get(), box, 1, x_init, x_init, - nullptr, a_tp0, a_tp1, -1, + nullptr, { a_tp0, a_tp1 }, -1, fr->cginfo, x, 0, nullptr); diff --git a/src/gromacs/nbnxm/benchmark/bench_setup.cpp b/src/gromacs/nbnxm/benchmark/bench_setup.cpp index 941772cae0..bae840cb14 100644 --- a/src/gromacs/nbnxm/benchmark/bench_setup.cpp +++ b/src/gromacs/nbnxm/benchmark/bench_setup.cpp @@ -230,7 +230,7 @@ setupNbnxmForBenchInstance(const KernelBenchOptions &options, nbnxn_put_on_grid(nbv.get(), system.box, 0, lowerCorner, upperCorner, - nullptr, 0, system.coordinates.size(), atomDensity, + nullptr, { 0, int(system.coordinates.size()) }, atomDensity, atomInfo, system.coordinates, 0, nullptr); diff --git a/src/gromacs/nbnxm/grid.cpp b/src/gromacs/nbnxm/grid.cpp index c6c000bc7c..5c1bcaa248 100644 --- a/src/gromacs/nbnxm/grid.cpp +++ b/src/gromacs/nbnxm/grid.cpp @@ -1006,19 +1006,18 @@ void Grid::fillCell(GridSetData *gridSetData, } } -void Grid::sortColumnsCpuGeometry(GridSetData *gridSetData, - int dd_zone, - int atomStart, int atomEnd, - const int *atinfo, +void Grid::sortColumnsCpuGeometry(GridSetData *gridSetData, + int dd_zone, + const int *atinfo, gmx::ArrayRef x, - nbnxn_atomdata_t *nbat, - int cxy_start, int cxy_end, - gmx::ArrayRef sort_work) + nbnxn_atomdata_t *nbat, + const gmx::Range columnRange, + gmx::ArrayRef sort_work) { if (debug) { - fprintf(debug, "cell_offset %d sorting columns %d - %d, atoms %d - %d\n", - cellOffset_, cxy_start, cxy_end, atomStart, atomEnd); + fprintf(debug, "cell_offset %d sorting columns %d - %d\n", + cellOffset_, *columnRange.begin(), *columnRange.end()); } const bool relevantAtomsAreWithinGridBounds = (dimensions_.maxAtomGroupRadius == 0); @@ -1026,7 +1025,7 @@ void Grid::sortColumnsCpuGeometry(GridSetData *gridSetData, const int numAtomsPerCell = geometry_.numAtomsPerCell; /* Sort the atoms within each x,y column in 3 dimensions */ - for (int cxy = cxy_start; cxy < cxy_end; cxy++) + for (int cxy : columnRange) { const int numAtoms = numAtomsInColumn(cxy); const int numCellsZ = cxy_ind_[cxy + 1] - cxy_ind_[cxy]; @@ -1075,22 +1074,21 @@ void Grid::sortColumnsCpuGeometry(GridSetData *gridSetData, } /* Spatially sort the atoms within one grid column */ -void Grid::sortColumnsGpuGeometry(GridSetData *gridSetData, - int dd_zone, - int atomStart, int atomEnd, - const int *atinfo, +void Grid::sortColumnsGpuGeometry(GridSetData *gridSetData, + int dd_zone, + const int *atinfo, gmx::ArrayRef x, - nbnxn_atomdata_t *nbat, - int cxy_start, int cxy_end, - gmx::ArrayRef sort_work) + nbnxn_atomdata_t *nbat, + const gmx::Range columnRange, + gmx::ArrayRef sort_work) { BoundingBox bb_work_array[2]; BoundingBox *bb_work_aligned = reinterpret_cast((reinterpret_cast(bb_work_array + 1)) & (~(static_cast(15)))); if (debug) { - fprintf(debug, "cell_offset %d sorting columns %d - %d, atoms %d - %d\n", - cellOffset_, cxy_start, cxy_end, atomStart, atomEnd); + fprintf(debug, "cell_offset %d sorting columns %d - %d\n", + cellOffset_, *columnRange.begin(), *columnRange.end()); } const bool relevantAtomsAreWithinGridBounds = (dimensions_.maxAtomGroupRadius == 0); @@ -1107,7 +1105,7 @@ void Grid::sortColumnsGpuGeometry(GridSetData *gridSetData, /* Sort the atoms within each x,y column in 3 dimensions. * Loop over all columns on the x/y grid. */ - for (int cxy = cxy_start; cxy < cxy_end; cxy++) + for (int cxy : columnRange) { const int gridX = cxy/dimensions_.numCells[YY]; const int gridY = cxy - gridX*dimensions_.numCells[YY]; @@ -1207,8 +1205,7 @@ static void setCellAndAtomCount(gmx::ArrayRef cell, void Grid::calcColumnIndices(const Grid::Dimensions &gridDims, const gmx::UpdateGroupsCog *updateGroupsCog, - const int atomStart, - const int atomEnd, + const gmx::Range atomRange, gmx::ArrayRef x, const int dd_zone, const int *move, @@ -1225,8 +1222,8 @@ void Grid::calcColumnIndices(const Grid::Dimensions &gridDims, cxy_na[i] = 0; } - int taskAtomStart = atomStart + static_cast((thread + 0)*(atomEnd - atomStart))/nthread; - int taskAtomEnd = atomStart + static_cast((thread + 1)*(atomEnd - atomStart))/nthread; + int taskAtomStart = *atomRange.begin() + static_cast((thread + 0)*atomRange.size())/nthread; + int taskAtomEnd = *atomRange.begin() + static_cast((thread + 1)*atomRange.size())/nthread; if (dd_zone == 0) { @@ -1327,8 +1324,7 @@ void Grid::setCellIndices(int ddZone, int cellOffset, GridSetData *gridSetData, gmx::ArrayRef gridWork, - int atomStart, - int atomEnd, + const gmx::Range atomRange, const int *atinfo, gmx::ArrayRef x, const int numAtomsMoved, @@ -1336,8 +1332,8 @@ void Grid::setCellIndices(int ddZone, { cellOffset_ = cellOffset; - srcAtomBegin_ = atomStart; - srcAtomEnd_ = atomEnd; + srcAtomBegin_ = *atomRange.begin(); + srcAtomEnd_ = *atomRange.end(); const int nthread = gmx_omp_nthreads_get(emntPairsearch); @@ -1416,7 +1412,7 @@ void Grid::setCellIndices(int ddZone, */ gmx::ArrayRef cells = gridSetData->cells; gmx::ArrayRef atomIndices = gridSetData->atomIndices; - for (int i = atomStart; i < atomEnd; i++) + for (int i : atomRange) { /* At this point nbs->cell contains the local grid x,y indices */ const int cxy = cells[i]; @@ -1440,20 +1436,20 @@ void Grid::setCellIndices(int ddZone, { try { - int columnStart = ((thread + 0)*numColumns())/nthread; - int columnEnd = ((thread + 1)*numColumns())/nthread; + gmx::Range columnRange(((thread + 0)*numColumns())/nthread, + ((thread + 1)*numColumns())/nthread); if (geometry_.isSimple) { sortColumnsCpuGeometry(gridSetData, ddZone, - atomStart, atomEnd, atinfo, x, nbat, - columnStart, columnEnd, + atinfo, x, nbat, + columnRange, gridWork[thread].sortBuffer); } else { sortColumnsGpuGeometry(gridSetData, ddZone, - atomStart, atomEnd, atinfo, x, nbat, - columnStart, columnEnd, + atinfo, x, nbat, + columnRange, gridWork[thread].sortBuffer); } } @@ -1484,7 +1480,7 @@ void Grid::setCellIndices(int ddZone, { fprintf(debug, "ns non-zero sub-cells: %d average atoms %.2f\n", numClustersTotal_, - (atomEnd - atomStart)/static_cast(numClustersTotal_)); + atomRange.size()/static_cast(numClustersTotal_)); print_bbsizes_supersub(debug, *this); } diff --git a/src/gromacs/nbnxm/grid.h b/src/gromacs/nbnxm/grid.h index 4785f4a549..008d0d3944 100644 --- a/src/gromacs/nbnxm/grid.h +++ b/src/gromacs/nbnxm/grid.h @@ -60,6 +60,7 @@ #include "gromacs/math/vectypes.h" #include "gromacs/utility/alignedallocator.h" #include "gromacs/utility/arrayref.h" +#include "gromacs/utility/range.h" struct gmx_domdec_zones_t; struct nbnxn_atomdata_t; @@ -415,8 +416,7 @@ class Grid int cellOffset, GridSetData *gridSetData, gmx::ArrayRef gridWork, - int atomStart, - int atomEnd, + gmx::Range atomRange, const int *atinfo, gmx::ArrayRef x, int numAtomsMoved, @@ -425,8 +425,7 @@ class Grid //! Determine in which grid columns atoms should go, store cells and atom counts in \p cell and \p cxy_na static void calcColumnIndices(const Grid::Dimensions &gridDims, const gmx::UpdateGroupsCog *updateGroupsCog, - int atomStart, - int atomEnd, + gmx::Range atomRange, gmx::ArrayRef x, int dd_zone, const int *move, @@ -448,25 +447,23 @@ class Grid gmx::ArrayRef x, BoundingBox gmx_unused *bb_work_aligned); - //! Spatially sort the atoms within one grid column - void sortColumnsCpuGeometry(GridSetData *gridSetData, - int dd_zone, - int atomStart, int atomEnd, - const int *atinfo, + //! Spatially sort the atoms within the given column range, for CPU geometry + void sortColumnsCpuGeometry(GridSetData *gridSetData, + int dd_zone, + const int *atinfo, gmx::ArrayRef x, - nbnxn_atomdata_t *nbat, - int cxy_start, int cxy_end, - gmx::ArrayRef sort_work); - - //! Spatially sort the atoms within one grid column - void sortColumnsGpuGeometry(GridSetData *gridSetData, - int dd_zone, - int atomStart, int atomEnd, - const int *atinfo, + nbnxn_atomdata_t *nbat, + gmx::Range columnRange, + gmx::ArrayRef sort_work); + + //! Spatially sort the atoms within the given column range, for GPU geometry + void sortColumnsGpuGeometry(GridSetData *gridSetData, + int dd_zone, + const int *atinfo, gmx::ArrayRef x, - nbnxn_atomdata_t *nbat, - int cxy_start, int cxy_end, - gmx::ArrayRef sort_work); + nbnxn_atomdata_t *nbat, + gmx::Range columnRange, + gmx::ArrayRef sort_work); /* Data members */ //! The geometry of the grid clusters and cells diff --git a/src/gromacs/nbnxm/gridset.cpp b/src/gromacs/nbnxm/gridset.cpp index 4f476b4e02..f5241a5905 100644 --- a/src/gromacs/nbnxm/gridset.cpp +++ b/src/gromacs/nbnxm/gridset.cpp @@ -138,8 +138,7 @@ void GridSet::putOnGrid(const matrix box, const rvec lowerCorner, const rvec upperCorner, const gmx::UpdateGroupsCog *updateGroupsCog, - const int atomStart, - const int atomEnd, + const gmx::Range atomRange, real atomDensity, gmx::ArrayRef atomInfo, gmx::ArrayRef x, @@ -160,18 +159,18 @@ void GridSet::putOnGrid(const matrix box, cellOffset = previousGrid.atomIndexEnd()/previousGrid.geometry().numAtomsPerCell; } - const int n = atomEnd - atomStart; + const int n = atomRange.size(); real maxAtomGroupRadius; if (gridIndex == 0) { copy_mat(box, box_); - numRealAtomsLocal_ = atomEnd - numAtomsMoved; + numRealAtomsLocal_ = *atomRange.end() - numAtomsMoved; /* We assume that nbnxn_put_on_grid is called first * for the local atoms (gridIndex=0). */ - numRealAtomsTotal_ = atomEnd - numAtomsMoved; + numRealAtomsTotal_ = *atomRange.end() - numAtomsMoved; maxAtomGroupRadius = (updateGroupsCog ? updateGroupsCog->maxUpdateGroupRadius() : 0); @@ -187,7 +186,7 @@ void GridSet::putOnGrid(const matrix box, atomDensity = dimsGrid0.atomDensity; maxAtomGroupRadius = dimsGrid0.maxAtomGroupRadius; - numRealAtomsTotal_ = std::max(numRealAtomsTotal_, atomEnd); + numRealAtomsTotal_ = std::max(numRealAtomsTotal_, *atomRange.end()); } /* We always use the home zone (grid[0]) for setting the cell size, @@ -209,7 +208,7 @@ void GridSet::putOnGrid(const matrix box, } /* Make space for the new cell indices */ - gridSetData_.cells.resize(atomEnd); + gridSetData_.cells.resize(*atomRange.end()); const int nthread = gmx_omp_nthreads_get(emntPairsearch); GMX_ASSERT(nthread > 0, "We expect the OpenMP thread count to be set"); @@ -221,7 +220,7 @@ void GridSet::putOnGrid(const matrix box, { Grid::calcColumnIndices(grid.dimensions(), updateGroupsCog, - atomStart, atomEnd, x, + atomRange, x, ddZone, move, thread, nthread, gridSetData_.cells, gridWork_[thread].numAtomsPerColumn); @@ -231,7 +230,7 @@ void GridSet::putOnGrid(const matrix box, /* Copy the already computed cell indices to the grid and sort, when needed */ grid.setCellIndices(ddZone, cellOffset, &gridSetData_, gridWork_, - atomStart, atomEnd, atomInfo.data(), x, numAtomsMoved, nbat); + atomRange, atomInfo.data(), x, numAtomsMoved, nbat); if (gridIndex == 0) { diff --git a/src/gromacs/nbnxm/gridset.h b/src/gromacs/nbnxm/gridset.h index 142a1f28b4..34aa5df17a 100644 --- a/src/gromacs/nbnxm/gridset.h +++ b/src/gromacs/nbnxm/gridset.h @@ -55,6 +55,7 @@ #include "gromacs/math/vectypes.h" #include "gromacs/utility/alignedallocator.h" #include "gromacs/utility/arrayref.h" +#include "gromacs/utility/range.h" #include "grid.h" #include "gridsetdata.h" @@ -122,8 +123,7 @@ class GridSet const rvec lowerCorner, const rvec upperCorner, const gmx::UpdateGroupsCog *updateGroupsCog, - int atomStart, - int atomEnd, + gmx::Range atomRange, real atomDensity, gmx::ArrayRef atomInfo, gmx::ArrayRef x, diff --git a/src/gromacs/nbnxm/nbnxm.cpp b/src/gromacs/nbnxm/nbnxm.cpp index 29b68c28b8..2f9fe49ed1 100644 --- a/src/gromacs/nbnxm/nbnxm.cpp +++ b/src/gromacs/nbnxm/nbnxm.cpp @@ -60,8 +60,7 @@ void nbnxn_put_on_grid(nonbonded_verlet_t *nb_verlet, const rvec lowerCorner, const rvec upperCorner, const gmx::UpdateGroupsCog *updateGroupsCog, - int atomStart, - int atomEnd, + gmx::Range atomRange, real atomDensity, gmx::ArrayRef atomInfo, gmx::ArrayRef x, @@ -69,7 +68,7 @@ void nbnxn_put_on_grid(nonbonded_verlet_t *nb_verlet, const int *move) { nb_verlet->pairSearch_->putOnGrid(box, gridIndex, lowerCorner, upperCorner, - updateGroupsCog, atomStart, atomEnd, atomDensity, + updateGroupsCog, atomRange, atomDensity, atomInfo, x, numAtomsMoved, move, nb_verlet->nbat.get()); } @@ -92,8 +91,7 @@ void nbnxn_put_on_grid_nonlocal(nonbonded_verlet_t *nbv, nbnxn_put_on_grid(nbv, nullptr, zone, c0, c1, nullptr, - zones->cg_range[zone], - zones->cg_range[zone+1], + { zones->cg_range[zone], zones->cg_range[zone+1] }, -1, atomInfo, x, diff --git a/src/gromacs/nbnxm/nbnxm.h b/src/gromacs/nbnxm/nbnxm.h index c93ea94b00..b799738f75 100644 --- a/src/gromacs/nbnxm/nbnxm.h +++ b/src/gromacs/nbnxm/nbnxm.h @@ -116,6 +116,7 @@ #include "gromacs/math/vectypes.h" #include "gromacs/utility/arrayref.h" #include "gromacs/utility/enumerationhelpers.h" +#include "gromacs/utility/range.h" #include "gromacs/utility/real.h" #include "locality.h" @@ -448,7 +449,7 @@ init_nb_verlet(const gmx::MDLogger &mdlog, /*! \brief Put the atoms on the pair search grid. * - * Only atoms atomStart to atomEnd in x are put on the grid. + * Only atoms with indices wihtin \p atomRange in x are put on the grid. * When \p updateGroupsCog != nullptr, atoms are put on the grid * based on the center of geometry of the group they belong to. * Atoms or COGs of groups should be within the bounding box provided, @@ -466,8 +467,7 @@ init_nb_verlet(const gmx::MDLogger &mdlog, * \param[in] lowerCorner Atom groups to be gridded should have coordinates >= this corner * \param[in] upperCorner Atom groups to be gridded should have coordinates <= this corner * \param[in] updateGroupsCog Centers of geometry for update groups, pass nullptr when not using update groups - * \param[in] atomStart Start of atom range to grid - * \param[in] atomEnd End of atom range to grid + * \param[in] atomRange Range of atoms to grid * \param[in] atomDensity An estimate of the atom density, used for peformance optimization and only with \p gridIndex = 0 * \param[in] atomInfo Atom information flags * \param[in] x Coordinates for atoms to grid @@ -480,8 +480,7 @@ void nbnxn_put_on_grid(nonbonded_verlet_t *nb_verlet, const rvec lowerCorner, const rvec upperCorner, const gmx::UpdateGroupsCog *updateGroupsCog, - int atomStart, - int atomEnd, + gmx::Range atomRange, real atomDensity, gmx::ArrayRef atomInfo, gmx::ArrayRef x, diff --git a/src/gromacs/nbnxm/pairsearch.h b/src/gromacs/nbnxm/pairsearch.h index 4258932001..d19eb8a918 100644 --- a/src/gromacs/nbnxm/pairsearch.h +++ b/src/gromacs/nbnxm/pairsearch.h @@ -180,8 +180,7 @@ class PairSearch const rvec lowerCorner, const rvec upperCorner, const gmx::UpdateGroupsCog *updateGroupsCog, - int atomStart, - int atomEnd, + gmx::Range atomRange, real atomDensity, gmx::ArrayRef atomInfo, gmx::ArrayRef x, @@ -192,7 +191,7 @@ class PairSearch cycleCounting_.start(enbsCCgrid); gridSet_.putOnGrid(box, ddZone, lowerCorner, upperCorner, - updateGroupsCog, atomStart, atomEnd, atomDensity, + updateGroupsCog, atomRange, atomDensity, atomInfo, x, numAtomsMoved, move, nbat); cycleCounting_.stop(enbsCCgrid);