From a6c1bc6c2a164087fc6aecfbfdf5f484f5441380 Mon Sep 17 00:00:00 2001 From: Berk Hess Date: Fri, 15 Mar 2019 10:36:13 +0100 Subject: [PATCH] Move around PairSearch code Renamed internal.h to pairsearch.h. Moved PairSearch member functions to new file pairsearch.cpp. TODO: Remove dependencies of pairlist.cpp on Pairsearch. TODO: Make all PairSearch functions in pairlist.cpp members. Change-Id: I21e3f93fa69a5ee0ffd00faf01a7d0267d7e79b9 --- src/gromacs/nbnxm/nbnxm.cpp | 2 +- src/gromacs/nbnxm/nbnxm_setup.cpp | 2 +- src/gromacs/nbnxm/pairlist.cpp | 91 +----------- src/gromacs/nbnxm/pairlist.h | 3 + src/gromacs/nbnxm/pairsearch.cpp | 135 ++++++++++++++++++ .../nbnxm/{internal.h => pairsearch.h} | 11 +- 6 files changed, 152 insertions(+), 92 deletions(-) create mode 100644 src/gromacs/nbnxm/pairsearch.cpp rename src/gromacs/nbnxm/{internal.h => pairsearch.h} (95%) diff --git a/src/gromacs/nbnxm/nbnxm.cpp b/src/gromacs/nbnxm/nbnxm.cpp index 4010a7520e..0aeb3d8d63 100644 --- a/src/gromacs/nbnxm/nbnxm.cpp +++ b/src/gromacs/nbnxm/nbnxm.cpp @@ -49,7 +49,7 @@ #include "gromacs/nbnxm/atomdata.h" #include "gromacs/timing/wallcycle.h" -#include "internal.h" +#include "pairsearch.h" /*! \cond INTERNAL */ diff --git a/src/gromacs/nbnxm/nbnxm_setup.cpp b/src/gromacs/nbnxm/nbnxm_setup.cpp index 2c5f31716c..023f78c685 100644 --- a/src/gromacs/nbnxm/nbnxm_setup.cpp +++ b/src/gromacs/nbnxm/nbnxm_setup.cpp @@ -63,7 +63,7 @@ #include "gpu_types.h" #include "grid.h" -#include "internal.h" +#include "pairsearch.h" namespace Nbnxm { diff --git a/src/gromacs/nbnxm/pairlist.cpp b/src/gromacs/nbnxm/pairlist.cpp index d7b4e483a1..8469c409ba 100644 --- a/src/gromacs/nbnxm/pairlist.cpp +++ b/src/gromacs/nbnxm/pairlist.cpp @@ -70,9 +70,9 @@ #include "gromacs/utility/gmxomp.h" #include "gromacs/utility/smalloc.h" -#include "grid.h" -#include "internal.h" +#include "gridset.h" #include "pairlistwork.h" +#include "pairsearch.h" using namespace gmx; // TODO: Remove when this file is moved into gmx namespace @@ -90,33 +90,6 @@ using InteractionLocality = Nbnxm::InteractionLocality; */ constexpr bool c_pbcShiftBackward = true; - -void PairSearch::SearchCycleCounting::printCycles(FILE *fp, - gmx::ArrayRef work) const -{ - fprintf(fp, "\n"); - fprintf(fp, "ns %4d grid %4.1f search %4.1f", - cc_[enbsCCgrid].count(), - cc_[enbsCCgrid].averageMCycles(), - cc_[enbsCCsearch].averageMCycles()); - - if (work.size() > 1) - { - if (cc_[enbsCCcombine].count() > 0) - { - fprintf(fp, " comb %5.2f", - cc_[enbsCCcombine].averageMCycles()); - } - fprintf(fp, " s. th"); - for (const PairsearchWork &workEntry : work) - { - fprintf(fp, " %4.1f", - workEntry.cycleCounter.averageMCycles()); - } - } - fprintf(fp, "\n"); -} - /* Layout for the nonbonded NxN pair lists */ enum class NbnxnLayout { @@ -231,8 +204,8 @@ static inline int xIndexFromCj(int cj) } #endif //GMX_SIMD -/* Initializes a single nbnxn_pairlist_t data structure */ -static void nbnxn_init_pairlist_fep(t_nblist *nl) + +void nbnxn_init_pairlist_fep(t_nblist *nl) { nl->type = GMX_NBLIST_INTERACTION_FREE_ENERGY; nl->igeometry = GMX_NBLIST_GEOMETRY_PARTICLE_PARTICLE; @@ -255,62 +228,6 @@ static void nbnxn_init_pairlist_fep(t_nblist *nl) } -static void free_nblist(t_nblist *nl) -{ - sfree(nl->iinr); - sfree(nl->gid); - sfree(nl->shift); - sfree(nl->jindex); - sfree(nl->jjnr); - sfree(nl->excl_fep); -} - -PairsearchWork::PairsearchWork() : - cp0({{0}} - ), - buffer_flags({0, nullptr, 0}), - ndistc(0), - nbl_fep(new t_nblist), - cp1({{0}}) -{ - nbnxn_init_pairlist_fep(nbl_fep.get()); -} - -PairsearchWork::~PairsearchWork() -{ - sfree(buffer_flags.flag); - - free_nblist(nbl_fep.get()); -} - -// TODO: Move to pairsearch.cpp -PairSearch::DomainSetup::DomainSetup(const int ePBC, - const ivec *numDDCells, - const gmx_domdec_zones_t *ddZones) : - ePBC(ePBC), - haveDomDec(numDDCells != nullptr), - zones(ddZones) -{ - for (int d = 0; d < DIM; d++) - { - haveDomDecPerDim[d] = (numDDCells != nullptr && (*numDDCells)[d] > 1); - } -} - -// TODO: Move to pairsearch.cpp -PairSearch::PairSearch(const int ePBC, - const ivec *numDDCells, - const gmx_domdec_zones_t *ddZones, - const PairlistType pairlistType, - const bool haveFep, - const int maxNumThreads) : - domainSetup_(ePBC, numDDCells, ddZones), - gridSet_(domainSetup_.haveDomDecPerDim, pairlistType, haveFep, maxNumThreads), - work_(maxNumThreads) -{ - cycleCounting_.recordCycles_ = (getenv("GMX_NBNXN_CYCLE") != nullptr); -} - static void init_buffer_flags(nbnxn_buffer_flags_t *flags, int natoms) { diff --git a/src/gromacs/nbnxm/pairlist.h b/src/gromacs/nbnxm/pairlist.h index 98a138ec74..b4bbc52c92 100644 --- a/src/gromacs/nbnxm/pairlist.h +++ b/src/gromacs/nbnxm/pairlist.h @@ -285,4 +285,7 @@ struct nbnxn_pairlist_set_t std::vector nbl_fep; /* List of free-energy atom pair interactions */ }; +//! Initializes a free-energy pair-list +void nbnxn_init_pairlist_fep(t_nblist *nl); + #endif diff --git a/src/gromacs/nbnxm/pairsearch.cpp b/src/gromacs/nbnxm/pairsearch.cpp new file mode 100644 index 0000000000..5ddd0d2d49 --- /dev/null +++ b/src/gromacs/nbnxm/pairsearch.cpp @@ -0,0 +1,135 @@ +/* + * This file is part of the GROMACS molecular simulation package. + * + * Copyright (c) 2019, by the GROMACS development team, led by + * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl, + * and including many others, as listed in the AUTHORS file in the + * top-level source directory and at http://www.gromacs.org. + * + * GROMACS is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * GROMACS is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with GROMACS; if not, see + * http://www.gnu.org/licenses, or write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * If you want to redistribute modifications to GROMACS, please + * consider that scientific software is very special. Version + * control is crucial - bugs must be traceable. We will be happy to + * consider code for inclusion in the official distribution, but + * derived work must not be called official GROMACS. Details are found + * in the README & COPYING files - if they are missing, get the + * official version at http://www.gromacs.org. + * + * To help us fund GROMACS development, we humbly ask that you cite + * the research papers on the package. Check out http://www.gromacs.org. + */ + +/*! \internal \file + * \brief + * Implements the PairSearch class + * + * \author Berk Hess + * \ingroup module_nbnxm + */ + +#include "gmxpre.h" + +#include "pairsearch.h" + +#include "gromacs/nbnxm/pairlist.h" +#include "gromacs/utility/smalloc.h" + + +void PairSearch::SearchCycleCounting::printCycles(FILE *fp, + gmx::ArrayRef work) const +{ + fprintf(fp, "\n"); + fprintf(fp, "ns %4d grid %4.1f search %4.1f", + cc_[enbsCCgrid].count(), + cc_[enbsCCgrid].averageMCycles(), + cc_[enbsCCsearch].averageMCycles()); + + if (work.size() > 1) + { + if (cc_[enbsCCcombine].count() > 0) + { + fprintf(fp, " comb %5.2f", + cc_[enbsCCcombine].averageMCycles()); + } + fprintf(fp, " s. th"); + for (const PairsearchWork &workEntry : work) + { + fprintf(fp, " %4.1f", + workEntry.cycleCounter.averageMCycles()); + } + } + fprintf(fp, "\n"); +} + +/*! \brief Frees the contents of a legacy t_nblist struct */ +static void free_nblist(t_nblist *nl) +{ + sfree(nl->iinr); + sfree(nl->gid); + sfree(nl->shift); + sfree(nl->jindex); + sfree(nl->jjnr); + sfree(nl->excl_fep); +} + +#ifndef DOXYGEN + +PairsearchWork::PairsearchWork() : + cp0({{0}} + ), + buffer_flags({0, nullptr, 0}), + ndistc(0), + nbl_fep(new t_nblist), + cp1({{0}}) +{ + nbnxn_init_pairlist_fep(nbl_fep.get()); +} + +#endif // !DOXYGEN + +PairsearchWork::~PairsearchWork() +{ + sfree(buffer_flags.flag); + + free_nblist(nbl_fep.get()); +} + +PairSearch::DomainSetup::DomainSetup(const int ePBC, + const ivec *numDDCells, + const gmx_domdec_zones_t *ddZones) : + ePBC(ePBC), + haveDomDec(numDDCells != nullptr), + zones(ddZones) +{ + for (int d = 0; d < DIM; d++) + { + haveDomDecPerDim[d] = (numDDCells != nullptr && (*numDDCells)[d] > 1); + } +} + +PairSearch::PairSearch(const int ePBC, + const ivec *numDDCells, + const gmx_domdec_zones_t *ddZones, + const PairlistType pairlistType, + const bool haveFep, + const int maxNumThreads) : + domainSetup_(ePBC, numDDCells, ddZones), + gridSet_(domainSetup_.haveDomDecPerDim, pairlistType, haveFep, maxNumThreads), + work_(maxNumThreads) +{ + cycleCounting_.recordCycles_ = (getenv("GMX_NBNXN_CYCLE") != nullptr); +} diff --git a/src/gromacs/nbnxm/internal.h b/src/gromacs/nbnxm/pairsearch.h similarity index 95% rename from src/gromacs/nbnxm/internal.h rename to src/gromacs/nbnxm/pairsearch.h index 368ebcf34f..4baeed6d79 100644 --- a/src/gromacs/nbnxm/internal.h +++ b/src/gromacs/nbnxm/pairsearch.h @@ -35,15 +35,20 @@ /*! \internal \file * - * \brief Declares internal nbnxm module details + * \brief Declares the PairSearch class and helper structs + * + * The PairSearch class holds the domain setup, the search grids + * and helper object for the pair search. It manages the search work. + * The actual gridding and pairlist generation is performeed by the + * GridSet/Grid and PairlistSet/Pairlist classes, respectively. * * \author Berk Hess * * \ingroup module_nbnxm */ -#ifndef GMX_NBNXM_INTERNAL_H -#define GMX_NBNXM_INTERNAL_H +#ifndef GMX_NBNXM_PAIRSEARCH_H +#define GMX_NBNXM_PAIRSEARCH_H #include #include -- 2.22.0