Merge release-4-6 into master
[alexxy/gromacs.git] / src / gromacs / legacyheaders / 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_ */