Fix use of inline in IMD
[alexxy/gromacs.git] / src / external / thread_mpi / include / thread_mpi / collective.h
1 /*
2    This source code file is part of thread_mpi.
3    Written by Sander Pronk, Erik Lindahl, and possibly others.
4
5    Copyright (c) 2009, Sander Pronk, Erik Lindahl.
6    All rights reserved.
7
8    Redistribution and use in source and binary forms, with or without
9    modification, are permitted provided that the following conditions are met:
10    1) Redistributions of source code must retain the above copyright
11    notice, this list of conditions and the following disclaimer.
12    2) Redistributions in binary form must reproduce the above copyright
13    notice, this list of conditions and the following disclaimer in the
14    documentation and/or other materials provided with the distribution.
15    3) Neither the name of the copyright holders nor the
16    names of its contributors may be used to endorse or promote products
17    derived from this software without specific prior written permission.
18
19    THIS SOFTWARE IS PROVIDED BY US ''AS IS'' AND ANY
20    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22    DISCLAIMED. IN NO EVENT SHALL WE BE LIABLE FOR ANY
23    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24    (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
26    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
30    If you want to redistribute modifications, please consider that
31    scientific software is very special. Version control is crucial -
32    bugs must be traceable. We will be happy to consider code for
33    inclusion in the official distribution, but derived work should not
34    be called official thread_mpi. Details are found in the README & COPYING
35    files.
36  */
37
38 #ifndef TMPI_COLLECTIVE_H_
39 #define TMPI_COLLECTIVE_H_
40
41 /** \file
42  *
43  * \brief Collective functions
44  *
45  */
46
47 #include "visibility.h"
48
49 #ifdef __cplusplus
50 extern "C"
51 {
52 #endif
53 #if 0
54 } /* Avoids screwing up auto-indentation */
55 #endif
56
57 /** Execute function once over comm
58
59     Executes a given function only once per collective call over comm.
60
61     Collective function.
62
63     \param[in] function     the function to call
64     \param[in] param        the parameter to the function
65     \param[out] was_first   set to 1 if the current thread was the one to
66                             execute the function. unchanged if current thread
67                             was not the one to execute the function; ignored
68                             if NULL.
69     \param[in] comm         The communicator.
70     \returns MPI_SUCCESS on success.
71  */
72 TMPI_EXPORT
73 int tMPI_Once(tMPI_Comm comm, void (*function)(void*), void *param,
74               int *was_first);
75
76 /** Execute function once over comm, and wait for the function to return
77     its value.
78
79     Executes a given function only once per collective call over comm.
80
81     Collective function.
82
83     \param[in] function     the function to call
84     \param[in] param        the parameter to the function
85     \param[out] was_first   set to 1 if the current thread was the one to
86                             execute the function. unchanged if current thread
87                             was not the one to execute the function; ignored
88                             if NULL.
89     \param[in] comm         The communicator.
90     \returns the return value of the function
91  */
92 TMPI_EXPORT
93 void* tMPI_Once_wait(tMPI_Comm comm, void* (*function)(void*), void *param,
94                      int *was_first);
95
96 /** Allocate a shared block of memory as a collective call.
97
98     Collective function.
99
100     \param[in] comm         The communicator
101     \param[in] size         The size in bytes to allocate
102  */
103 TMPI_EXPORT
104 void* tMPI_Shmalloc(tMPI_Comm comm, size_t size);
105
106
107
108
109
110
111 #include "atomic.h"
112
113 typedef struct
114 {
115     tMPI_Atomic_t n_remaining; /* number of remaining operations */
116     void         *res;         /* result pointer */
117     tMPI_Comm     comm;
118 } tMPI_Reduce_req;
119
120 /** Allocate data structure for asynchronous reduce. */
121 TMPI_EXPORT
122 tMPI_Reduce_req *tMPI_Reduce_req_alloc(tMPI_Comm comm);
123
124 #ifdef __cplusplus
125 } /* closing extern "C" */
126 #endif
127
128 #endif /* TMPI_COLLECTIVE_H_ */