Split lines with many copyright years
[alexxy/gromacs.git] / src / gromacs / utility / gmxomp.h
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
4  * Copyright (c) 2012,2013,2014,2015,2016 by the GROMACS development team.
5  * Copyright (c) 2018,2019,2020, by the GROMACS development team, led by
6  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
7  * and including many others, as listed in the AUTHORS file in the
8  * top-level source directory and at http://www.gromacs.org.
9  *
10  * GROMACS is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU Lesser General Public License
12  * as published by the Free Software Foundation; either version 2.1
13  * of the License, or (at your option) any later version.
14  *
15  * GROMACS is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18  * Lesser General Public License for more details.
19  *
20  * You should have received a copy of the GNU Lesser General Public
21  * License along with GROMACS; if not, see
22  * http://www.gnu.org/licenses, or write to the Free Software Foundation,
23  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
24  *
25  * If you want to redistribute modifications to GROMACS, please
26  * consider that scientific software is very special. Version
27  * control is crucial - bugs must be traceable. We will be happy to
28  * consider code for inclusion in the official distribution, but
29  * derived work must not be called official GROMACS. Details are found
30  * in the README & COPYING files - if they are missing, get the
31  * official version at http://www.gromacs.org.
32  *
33  * To help us fund GROMACS development, we humbly ask that you cite
34  * the research papers on the package. Check out http://www.gromacs.org.
35  */
36 /*! \libinternal \file
37  * \brief
38  * Declares OpenMP wrappers to avoid conditional compilation.
39  *
40  * This module defines wrappers for OpenMP API functions and enables compiling
41  * code without conditional compilation even when OpenMP is turned off in the
42  * build system.
43  * Therefore, OpenMP API functions should always be used through these wrappers
44  * and omp.h should never be directly included.  Instead, this header should be
45  * used whenever OpenMP API functions are needed.
46  *
47  * \inlibraryapi
48  * \ingroup module_utility
49  */
50 #ifndef GMX_UTILITY_OMP_H
51 #define GMX_UTILITY_OMP_H
52
53 #include "config.h"
54
55 #include <stdio.h>
56
57 #if GMX_NATIVE_WINDOWS
58 #    include <windows.h>
59 #elif HAVE_XMMINTRIN_H
60 #    include <xmmintrin.h>
61 #endif
62
63 #include "gromacs/utility/basedefinitions.h"
64
65 /*! \addtogroup module_utility
66  * \{
67  */
68
69 /*! \brief
70  * Returns an integer equal to or greater than the number of threads
71  * that would be available if a parallel region without num_threads were
72  * defined at that point in the code.
73  *
74  * Acts as a wrapper for omp_get_max_threads().
75  */
76 int gmx_omp_get_max_threads();
77
78 /*! \brief
79  * Returns the number of processors available when the function is called.
80  *
81  * Acts as a wrapper around omp_get_num_procs().
82  */
83 int gmx_omp_get_num_procs();
84
85 /*! \brief
86  * Returns the thread number of the thread executing within its thread team.
87  *
88  * Acts as a wrapper for omp_get_thread_num().
89  */
90 int gmx_omp_get_thread_num();
91
92 /*! \brief
93  * Sets the number of threads in subsequent parallel regions, unless overridden
94  * by a num_threads clause.
95  *
96  * Acts as a wrapper for omp_set_num_threads().
97  */
98 void gmx_omp_set_num_threads(int num_threads);
99
100 /*! \brief
101  * Check for externally set thread affinity to avoid conflicts with \Gromacs
102  * internal setting.
103  *
104  * \param[out] message  Receives the message to be shown to the user.
105  * \returns `true` if we can set thread affinity ourselves.
106  *
107  * The KMP_AFFINITY environment variable is used by Intel, GOMP_CPU_AFFINITY
108  * by the GNU compilers (Intel also honors it well).  If any of the variables
109  * is set, we should honor it and disable the internal pinning.
110  *
111  * If this function returns `false`, the caller is responsible to disable the
112  * pinning, show the message from \p *message to the user, and free the memory
113  * allocated for \p *message.
114  * If the return value is `true`, \p *message is NULL.
115  */
116 gmx_bool gmx_omp_check_thread_affinity(char** message);
117
118 /*! \brief
119  * Pause for use in a spin-wait loop.
120  */
121 static inline void gmx_pause()
122 {
123 #if GMX_NATIVE_WINDOWS
124     YieldProcessor();
125 #elif HAVE_XMMINTRIN_H
126     _mm_pause();
127 #elif defined __MIC__
128     _mm_delay_32(32);
129 #else
130     // No wait for unknown architecture
131 #endif
132 }
133
134 /*! \} */
135
136 #endif