147199771cb7ed5d5ff396b7e90fb4c945a9d2c6
[alexxy/gromacs.git] / src / gromacs / mdtypes / simulation_workload.h
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
4  * Copyright (c) 2018,2019, by the GROMACS development team, led by
5  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
6  * and including many others, as listed in the AUTHORS file in the
7  * top-level source directory and at http://www.gromacs.org.
8  *
9  * GROMACS is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public License
11  * as published by the Free Software Foundation; either version 2.1
12  * of the License, or (at your option) any later version.
13  *
14  * GROMACS is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with GROMACS; if not, see
21  * http://www.gnu.org/licenses, or write to the Free Software Foundation,
22  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
23  *
24  * If you want to redistribute modifications to GROMACS, please
25  * consider that scientific software is very special. Version
26  * control is crucial - bugs must be traceable. We will be happy to
27  * consider code for inclusion in the official distribution, but
28  * derived work must not be called official GROMACS. Details are found
29  * in the README & COPYING files - if they are missing, get the
30  * official version at http://www.gromacs.org.
31  *
32  * To help us fund GROMACS development, we humbly ask that you cite
33  * the research papers on the package. Check out http://www.gromacs.org.
34  */
35 /*! \libinternal \file
36  * \brief Declares step, domain-lifetime, and run workload managers.
37  *
38  * \author Mark Abraham <mark.j.abraham@gmail.com>
39  * \author Szilárd Páll <pall.szilard@gmail.com>
40  * \ingroup module_mdlib
41  * \inlibraryapi
42  */
43 #ifndef GMX_MDTYPES_SIMULATION_WORKLOAD_H
44 #define GMX_MDTYPES_SIMULATION_WORKLOAD_H
45
46 namespace gmx
47 {
48
49 /*! \libinternal
50  * \brief Data structure that describes work that can change per-step.
51  *
52  * Note that the contents of an object of this type has a lifetime
53  * of a single step and it is expected to be set at the beginning each step.
54  *
55  * The initial set of flags map the legacy force flags to boolean flags;
56  * these have the role of directing per-step compute tasks undertaken by a PP rank.
57  *
58  */
59 class StepWorkload
60 {
61     public:
62         //! Whether the state has changed, always set unless TPI is used.
63         bool stateChanged = false;
64         //! Whether the box might have changed
65         bool haveDynamicBox = false;
66         //! Whether neighbor searching needs to be done this step
67         bool doNeighborSearch = false;
68         //! Whether virial needs to be computed this step
69         bool computeVirial = false;
70         //! Whether energies need to be computed this step this step
71         bool computeEnergy = false;
72         //! Whether (any) forces need to be computed this step, not only energies
73         bool computeForces = false;
74         //! Whether nonbonded forces need to be computed this step
75         bool computeNonbondedForces = false;
76         //! Whether listed forces need to be computed this step
77         bool computeListedForces = false;
78         //! Whether this step DHDL needs to be computed
79         bool computeDhdl = false;
80         /*! \brief Whether coordinate buffer ops are done on the GPU this step
81          * \note This technically belongs to DomainLifetimeWorkload but due
82          * to needing the flag before DomainLifetimeWorkload is built we keep
83          * it here for now.
84          */
85         bool useGpuXBufferOps  = false;
86         //! Whether force buffer ops are done on the GPU this step
87         bool useGpuFBufferOps  = false;
88         //! Whether PME forces are reduced with other contributions on the GPU this step
89         bool useGpuPmeFReduction = false; // TODO: add this flag to the internal PME GPU data structures too
90 };
91
92 /*! \libinternal
93  * \brief Manage computational work that has the lifetime of decomposition.
94  *
95  * An object of this type is updated every decomposition step
96  * (i.e. domain decomposition / neighbour search)
97  * reflecting what work is required during the lifetime of a domain.
98  * e.g. whether there are bonded interactions in this PP task.
99  *
100  * This will remove the desire for inline getters from modules that
101  * describe whether they have work to do, because that can be set up
102  * once per simulation or neighborlist lifetime and not changed
103  * thereafter.
104  */
105 class DomainLifetimeWorkload
106 {
107     public:
108         //! Whether the current nstlist step-range has bonded work to run on a GPU.
109         bool haveGpuBondedWork = false;
110         //! Whether the current nstlist step-range has bonded work to run on he CPU.
111         bool haveCpuBondedWork = false;
112         //! Whether the current nstlist step-range has restraints work to run on he CPU.
113         bool haveRestraintsWork = false;
114         //! Whether the current nstlist step-range has listed forces work to run on he CPU.
115         //  Note: currently this is haveCpuBondedWork | haveRestraintsWork
116         bool haveCpuListedForceWork = false;
117         //! Whether the current nstlist step-range has special forces on the CPU.
118         bool haveSpecialForces = false;
119
120         // TODO
121         //! Whether the current nstlist step-range Free energy work on the CPU.
122         bool haveFreeEnergyWork = false;
123 };
124
125 /*! \libinternal
126  * \brief Manage what computation is required during the simulation.
127  *
128  * Holds information on the type of workload constant for the entire
129  * simulation.
130  *
131  * An object of this type is constructed at the beginning of the
132  * simulation and is expected to not change.
133  */
134 class SimulationWorkload
135 {
136     public:
137         //! If we have calculation of short range nonbondeds on GPU
138         bool useGpuNonbonded           = false;
139         //! If we have calculation of long range PME in GPU
140         bool usePmeGpu                 = false;
141         //! If PME FFT solving is done on GPU.
142         bool usePmeFftGpu              = false;
143         //! If bonded interactions are calculated on GPU.
144         bool useGpuBonded              = false;
145         //! If update and constraint solving is performed on GPU.
146         bool useGpuUpdate              = false;
147         //! If buffer operations are performed on GPU.
148         bool useGpuBufferOps           = false;
149         //! If domain decomposition halo exchange is performed on GPU.
150         bool useGpuHaloExchange        = false;
151         //! If direct PP-PME communication between GPU is used.
152         bool useGpuPmePPCommunication  = false;
153         //! If direct GPU-GPU communication is enabled.
154         bool useGpuDirectCommunication = false;
155 };
156
157 class MdrunScheduleWorkload
158 {
159     public:
160         //! Workload descriptor for information constant for an entire run
161         SimulationWorkload     simulationWork;
162
163         //! Workload descriptor for information constant for an nstlist range of steps
164         DomainLifetimeWorkload domainWork;
165
166         //! Workload descriptor for information that may change per-step
167         StepWorkload           stepWork;
168 };
169
170 }      // namespace gmx
171
172 #endif // GMX_MDTYPES_SIMULATION_WORKLOAD_H