Use gmx::Range in Nbnxm gridding functions
authorBerk Hess <hess@kth.se>
Wed, 23 Oct 2019 09:00:24 +0000 (11:00 +0200)
committerMagnus Lundborg <magnus.lundborg@scilifelab.se>
Wed, 23 Oct 2019 17:59:08 +0000 (19:59 +0200)
Change-Id: Ice818946dc78375065797056762acd340921ea70

src/gromacs/domdec/partition.cpp
src/gromacs/mdlib/sim_util.cpp
src/gromacs/mdrun/tpi.cpp
src/gromacs/nbnxm/benchmark/bench_setup.cpp
src/gromacs/nbnxm/grid.cpp
src/gromacs/nbnxm/grid.h
src/gromacs/nbnxm/gridset.cpp
src/gromacs/nbnxm/gridset.h
src/gromacs/nbnxm/nbnxm.cpp
src/gromacs/nbnxm/nbnxm.h
src/gromacs/nbnxm/pairsearch.h

index 918f57c9151edb994c822b5f56c0bea713926c26..8282b239dcb752dac2a4ea38bb7e58ddc7b11e38 100644 (file)
@@ -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,
index 6d2ad7048eaff5c6c70d7cc38ada730d3d155961..e50cc4f9199e55b194f0b2ffbbfb2c1ea8c08a5f 100644 (file)
@@ -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);
index 46b185a1289397541e60769075f4ee044767a8f2..c0db5dd99253a0ce429c41df732b15d2dc6913ec 100644 (file)
@@ -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);
 
index 941772cae0f820a13b93f7aca6f3cff946e3e4f1..bae840cb144bc7f0408febf46ba0a738c50f9ca8 100644 (file)
@@ -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);
 
index c6c000bc7ca78a95ad09f1c5f2f407cef8413ff6..5c1bcaa248b4f6f773bd615f3b096119a0046191 100644 (file)
@@ -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<const gmx::RVec> x,
-                                  nbnxn_atomdata_t *nbat,
-                                  int cxy_start, int cxy_end,
-                                  gmx::ArrayRef<int> sort_work)
+                                  nbnxn_atomdata_t              *nbat,
+                                  const gmx::Range<int>          columnRange,
+                                  gmx::ArrayRef<int>             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<const gmx::RVec> x,
-                                  nbnxn_atomdata_t *nbat,
-                                  int cxy_start, int cxy_end,
-                                  gmx::ArrayRef<int> sort_work)
+                                  nbnxn_atomdata_t              *nbat,
+                                  const gmx::Range<int>          columnRange,
+                                  gmx::ArrayRef<int>             sort_work)
 {
     BoundingBox  bb_work_array[2];
     BoundingBox *bb_work_aligned = reinterpret_cast<BoundingBox *>((reinterpret_cast<std::size_t>(bb_work_array + 1)) & (~(static_cast<std::size_t>(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<int>  cell,
 
 void Grid::calcColumnIndices(const Grid::Dimensions         &gridDims,
                              const gmx::UpdateGroupsCog     *updateGroupsCog,
-                             const int                       atomStart,
-                             const int                       atomEnd,
+                             const gmx::Range<int>           atomRange,
                              gmx::ArrayRef<const gmx::RVec>  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<int>((thread + 0)*(atomEnd - atomStart))/nthread;
-    int taskAtomEnd   = atomStart + static_cast<int>((thread + 1)*(atomEnd - atomStart))/nthread;
+    int taskAtomStart = *atomRange.begin() + static_cast<int>((thread + 0)*atomRange.size())/nthread;
+    int taskAtomEnd   = *atomRange.begin() + static_cast<int>((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>         gridWork,
-                          int                             atomStart,
-                          int                             atomEnd,
+                          const gmx::Range<int>           atomRange,
                           const int                      *atinfo,
                           gmx::ArrayRef<const gmx::RVec>  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<int> cells       = gridSetData->cells;
     gmx::ArrayRef<int> 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<int> 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<double>(numClustersTotal_));
+                    atomRange.size()/static_cast<double>(numClustersTotal_));
 
             print_bbsizes_supersub(debug, *this);
         }
index 4785f4a549855ea70732a99d5a5060e12752db62..008d0d3944c6777e7af8bead8e9a2e1f97726f5e 100644 (file)
@@ -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>         gridWork,
-                            int                             atomStart,
-                            int                             atomEnd,
+                            gmx::Range<int>                 atomRange,
                             const int                      *atinfo,
                             gmx::ArrayRef<const gmx::RVec>  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<int>                 atomRange,
                                       gmx::ArrayRef<const gmx::RVec>  x,
                                       int                             dd_zone,
                                       const int                      *move,
@@ -448,25 +447,23 @@ class Grid
                       gmx::ArrayRef<const gmx::RVec>  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<const gmx::RVec> x,
-                                    nbnxn_atomdata_t *nbat,
-                                    int cxy_start, int cxy_end,
-                                    gmx::ArrayRef<int> 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<int>                columnRange,
+                                    gmx::ArrayRef<int>             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<const gmx::RVec> x,
-                                    nbnxn_atomdata_t *nbat,
-                                    int cxy_start, int cxy_end,
-                                    gmx::ArrayRef<int> sort_work);
+                                    nbnxn_atomdata_t              *nbat,
+                                    gmx::Range<int>                columnRange,
+                                    gmx::ArrayRef<int>             sort_work);
 
         /* Data members */
         //! The geometry of the grid clusters and cells
index 4f476b4e02e283246ecea2cc55e48dd823cbffc5..f5241a5905eb536e25a36117417651a2020d63a8 100644 (file)
@@ -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<int>           atomRange,
                         real                            atomDensity,
                         gmx::ArrayRef<const int>        atomInfo,
                         gmx::ArrayRef<const gmx::RVec>  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)
     {
index 142a1f28b4126b53a18e6638c59d5dc197369734..34aa5df17ac024a98018b44c93f6a439dc13c2a8 100644 (file)
@@ -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<int>                 atomRange,
                        real                            atomDensity,
                        gmx::ArrayRef<const int>        atomInfo,
                        gmx::ArrayRef<const gmx::RVec>  x,
index 29b68c28b8f1f40fd791799e50411ce76d301938..2f9fe49ed12c175f5d5147efca4b368da48881fc 100644 (file)
@@ -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<int>                 atomRange,
                        real                            atomDensity,
                        gmx::ArrayRef<const int>        atomInfo,
                        gmx::ArrayRef<const gmx::RVec>  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,
index c93ea94b00f941fe58e9a7b5398328a76cabe30d..b799738f75d86881a7ff228db0daef9290d05fb9 100644 (file)
 #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<int>                 atomRange,
                        real                            atomDensity,
                        gmx::ArrayRef<const int>        atomInfo,
                        gmx::ArrayRef<const gmx::RVec>  x,
index 42589320012c05c84d62b059a4aa5e1ed043e4fa..d19eb8a9187ad3950ee4c60d38a0d1515c9b51f4 100644 (file)
@@ -180,8 +180,7 @@ class PairSearch
                        const rvec                      lowerCorner,
                        const rvec                      upperCorner,
                        const gmx::UpdateGroupsCog     *updateGroupsCog,
-                       int                             atomStart,
-                       int                             atomEnd,
+                       gmx::Range<int>                 atomRange,
                        real                            atomDensity,
                        gmx::ArrayRef<const int>        atomInfo,
                        gmx::ArrayRef<const gmx::RVec>  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);