d1793c8fe5496ac85dafa8acd03eb3d0f181458c
[alexxy/gromacs.git] / src / gromacs / taskassignment / hardwareassign.h
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
4  * Copyright (c) 2016,2017, 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 /*! \defgroup module_taskassignment Assigning simulation tasks to hardware (taskassignment)
36  * \ingroup group_mdrun
37  * \brief Provides code that manages assignment of simulation tasks to hardware.
38  */
39 /*! \libinternal
40  * \file
41  * \brief Declares high-level functionality for managing assigning
42  * tasks on ranks of a node to hardware on that node.
43  *
44  * \author Mark Abraham <mark.j.abraham@gmail.com>
45  * \ingroup module_taskassignment
46  * \inlibraryapi
47  */
48 #ifndef GMX_TASKASSIGNMENT_HARDWAREASSIGN_H
49 #define GMX_TASKASSIGNMENT_HARDWAREASSIGN_H
50
51 #include <string>
52 #include <vector>
53
54 #include "gromacs/utility/basedefinitions.h"
55
56 struct gmx_gpu_info_t;
57 struct gmx_hw_opt_t;
58 struct t_commrec;
59
60 namespace gmx
61 {
62
63 class MDLogger;
64
65 /*! \brief Parse a GPU assignment string into digits
66  *
67  * \param[in]   gpuTaskAssignment  String like "013" or "0,1,3" typically
68  *                                 supplied by the user to mdrun -gpu_id.
69  *
70  * \returns  A vector of integer GPU ids, like {0, 1, 3}.
71  *
72  * \throws   std::bad_alloc     If out of memory.
73  *           InvalidInputError  If an invalid character is found (ie not a digit or ',').
74  */
75 std::vector<int> parseGpuTaskAssignment(const std::string &gpuTaskAssignment);
76
77 /*! \brief Assign PP ranks to valid GPU IDs.
78  *
79  * Will return a validated mapping from PP ranks (ie tasks that can
80  * run on GPUs) to the device IDs of compatible GPUs on their node.
81  * This will be from any non-empty assignment in hw_opt, otherwise a
82  * default automated mapping is generated.
83  *
84  * Note that PME-only ranks have always ignored mdrun -gpu_id, so do
85  * not attempt to validate -gpu_id. They should continue this behaviour
86  * until PME tasks can use GPUs.
87  *
88  * \param[in]     rankCanUseGpu          Whether this rank can execute a task on a GPU.
89  * \param[in]     cr                     Communication record.
90  * \param[in]     gpu_info               Information detected about GPUs, including compatibility.
91  * \param[in]     hw_opt                 Parallelisation options, including any user-specified GPU task assignment.
92  *
93  * \returns  A valid GPU selection.
94  */
95 std::vector<int> mapPpRanksToGpus(bool                    rankCanUseGpu,
96                                   const t_commrec        *cr,
97                                   const gmx_gpu_info_t   &gpu_info,
98                                   const gmx_hw_opt_t     &hw_opt);
99
100 } // namespace
101
102 /*! \brief Log a report on how GPUs are (or could be) being used on
103  * the ranks of the physical node of rank 0 of the simulation.
104  *
105  * \todo It could be useful to report also whether any nodes differed,
106  * and in what way.
107  *
108  * \param[out] mdlog              Logging object.
109  * \param[in]  gpu_info           Information detected about GPUs
110  * \param[in]  userSetGpuIds      Whether the user selected the GPU ids
111  * \param[in]  gpuTaskAssignment  The selected GPU IDs.
112  * \param[in]  numPpRanks         Number of PP ranks per node
113  * \param[in]  bPrintHostName     Print the hostname in the usage information
114  *
115  * \throws                        std::bad_alloc if out of memory */
116 void reportGpuUsage(const gmx::MDLogger    &mdlog,
117                     const gmx_gpu_info_t   &gpu_info,
118                     bool                    userSetGpuIds,
119                     const std::vector<int> &gpuTaskAssignment,
120                     size_t                  numPpRanks,
121                     bool                    bPrintHostName);
122
123 #endif