1 /*
2  * Copyright (C) by Argonne National Laboratory
3  *     See COPYRIGHT in top-level directory
4  */
5 
6 #ifndef MPIR_CSEL_H_INCLUDED
7 #define MPIR_CSEL_H_INCLUDED
8 
9 #include "json.h"
10 #include "coll_impl.h"
11 
12 typedef enum {
13     MPIR_CSEL_COLL_TYPE__ALLGATHER = 0,
14     MPIR_CSEL_COLL_TYPE__ALLGATHERV,
15     MPIR_CSEL_COLL_TYPE__ALLREDUCE,
16     MPIR_CSEL_COLL_TYPE__ALLTOALL,
17     MPIR_CSEL_COLL_TYPE__ALLTOALLV,
18     MPIR_CSEL_COLL_TYPE__ALLTOALLW,
19     MPIR_CSEL_COLL_TYPE__BARRIER,
20     MPIR_CSEL_COLL_TYPE__BCAST,
21     MPIR_CSEL_COLL_TYPE__EXSCAN,
22     MPIR_CSEL_COLL_TYPE__GATHER,
23     MPIR_CSEL_COLL_TYPE__GATHERV,
24     MPIR_CSEL_COLL_TYPE__IALLGATHER,
25     MPIR_CSEL_COLL_TYPE__IALLGATHERV,
26     MPIR_CSEL_COLL_TYPE__IALLREDUCE,
27     MPIR_CSEL_COLL_TYPE__IALLTOALL,
28     MPIR_CSEL_COLL_TYPE__IALLTOALLV,
29     MPIR_CSEL_COLL_TYPE__IALLTOALLW,
30     MPIR_CSEL_COLL_TYPE__IBARRIER,
31     MPIR_CSEL_COLL_TYPE__IBCAST,
32     MPIR_CSEL_COLL_TYPE__IEXSCAN,
33     MPIR_CSEL_COLL_TYPE__IGATHER,
34     MPIR_CSEL_COLL_TYPE__IGATHERV,
35     MPIR_CSEL_COLL_TYPE__INEIGHBOR_ALLGATHER,
36     MPIR_CSEL_COLL_TYPE__INEIGHBOR_ALLGATHERV,
37     MPIR_CSEL_COLL_TYPE__INEIGHBOR_ALLTOALL,
38     MPIR_CSEL_COLL_TYPE__INEIGHBOR_ALLTOALLV,
39     MPIR_CSEL_COLL_TYPE__INEIGHBOR_ALLTOALLW,
40     MPIR_CSEL_COLL_TYPE__IREDUCE,
41     MPIR_CSEL_COLL_TYPE__IREDUCE_SCATTER,
42     MPIR_CSEL_COLL_TYPE__IREDUCE_SCATTER_BLOCK,
43     MPIR_CSEL_COLL_TYPE__ISCAN,
44     MPIR_CSEL_COLL_TYPE__ISCATTER,
45     MPIR_CSEL_COLL_TYPE__ISCATTERV,
46     MPIR_CSEL_COLL_TYPE__NEIGHBOR_ALLGATHER,
47     MPIR_CSEL_COLL_TYPE__NEIGHBOR_ALLGATHERV,
48     MPIR_CSEL_COLL_TYPE__NEIGHBOR_ALLTOALL,
49     MPIR_CSEL_COLL_TYPE__NEIGHBOR_ALLTOALLV,
50     MPIR_CSEL_COLL_TYPE__NEIGHBOR_ALLTOALLW,
51     MPIR_CSEL_COLL_TYPE__REDUCE,
52     MPIR_CSEL_COLL_TYPE__REDUCE_SCATTER,
53     MPIR_CSEL_COLL_TYPE__REDUCE_SCATTER_BLOCK,
54     MPIR_CSEL_COLL_TYPE__SCAN,
55     MPIR_CSEL_COLL_TYPE__SCATTER,
56     MPIR_CSEL_COLL_TYPE__SCATTERV,
57     MPIR_CSEL_COLL_TYPE__END,
58 } MPIR_Csel_coll_type_e;
59 
60 typedef struct {
61     MPIR_Csel_coll_type_e coll_type;
62     MPIR_Comm *comm_ptr;
63 
64     union {
65         struct {
66             const void *sendbuf;
67             int sendcount;
68             MPI_Datatype sendtype;
69             void *recvbuf;
70             int recvcount;
71             MPI_Datatype recvtype;
72         } allgather, iallgather, neighbor_allgather, ineighbor_allgather;
73         struct {
74             const void *sendbuf;
75             int sendcount;
76             MPI_Datatype sendtype;
77             void *recvbuf;
78             const int *recvcounts;
79             const int *displs;
80             MPI_Datatype recvtype;
81         } allgatherv, iallgatherv, neighbor_allgatherv, ineighbor_allgatherv;
82         struct {
83             const void *sendbuf;
84             void *recvbuf;
85             int count;
86             MPI_Datatype datatype;
87             MPI_Op op;
88         } allreduce, iallreduce;
89         struct {
90             const void *sendbuf;
91             int sendcount;
92             MPI_Datatype sendtype;
93             int recvcount;
94             void *recvbuf;
95             MPI_Datatype recvtype;
96         } alltoall, ialltoall, neighbor_alltoall, ineighbor_alltoall;
97         struct {
98             const void *sendbuf;
99             const int *sendcounts;
100             const int *sdispls;
101             MPI_Datatype sendtype;
102             void *recvbuf;
103             const int *recvcounts;
104             const int *rdispls;
105             MPI_Datatype recvtype;
106         } alltoallv, ialltoallv, neighbor_alltoallv, ineighbor_alltoallv;
107         struct {
108             const void *sendbuf;
109             const int *sendcounts;
110             const int *sdispls;
111             const MPI_Datatype *sendtypes;
112             void *recvbuf;
113             const int *recvcounts;
114             const int *rdispls;
115             const MPI_Datatype *recvtypes;
116         } alltoallw, ialltoallw;
117         struct {
118             const void *sendbuf;
119             const int *sendcounts;
120             const MPI_Aint *sdispls;
121             const MPI_Datatype *sendtypes;
122             void *recvbuf;
123             const int *recvcounts;
124             const MPI_Aint *rdispls;
125             const MPI_Datatype *recvtypes;
126         } neighbor_alltoallw, ineighbor_alltoallw;
127         struct {
128             int dummy;          /* some compiler (suncc) doesn't like empty struct */
129         } barrier, ibarrier;
130         struct {
131             void *buffer;
132             int count;
133             MPI_Datatype datatype;
134             int root;
135         } bcast, ibcast;
136         struct {
137             const void *sendbuf;
138             void *recvbuf;
139             int count;
140             MPI_Datatype datatype;
141             MPI_Op op;
142         } exscan, iexscan;
143         struct {
144             const void *sendbuf;
145             int sendcount;
146             MPI_Datatype sendtype;
147             int recvcount;
148             void *recvbuf;
149             MPI_Datatype recvtype;
150             int root;
151         } gather, igather, scatter, iscatter;
152         struct {
153             const void *sendbuf;
154             int sendcount;
155             MPI_Datatype sendtype;
156             void *recvbuf;
157             const int *recvcounts;
158             const int *displs;
159             MPI_Datatype recvtype;
160             int root;
161         } gatherv, igatherv;
162         struct {
163             const void *sendbuf;
164             void *recvbuf;
165             int count;
166             MPI_Datatype datatype;
167             MPI_Op op;
168             int root;
169         } reduce, ireduce;
170         struct {
171             const void *sendbuf;
172             void *recvbuf;
173             const int *recvcounts;
174             MPI_Datatype datatype;
175             MPI_Op op;
176         } reduce_scatter, ireduce_scatter;
177         struct {
178             const void *sendbuf;
179             void *recvbuf;
180             int recvcount;
181             MPI_Datatype datatype;
182             MPI_Op op;
183         } reduce_scatter_block, ireduce_scatter_block;
184         struct {
185             const void *sendbuf;
186             void *recvbuf;
187             int count;
188             MPI_Datatype datatype;
189             MPI_Op op;
190         } scan, iscan;
191         struct {
192             const void *sendbuf;
193             const int *sendcounts;
194             const int *displs;
195             MPI_Datatype sendtype;
196             int recvcount;
197             void *recvbuf;
198             MPI_Datatype recvtype;
199             int root;
200         } scatterv, iscatterv;
201     } u;
202 } MPIR_Csel_coll_sig_s;
203 
204 int MPIR_Csel_create_from_file(const char *json_file,
205                                void *(*create_container) (struct json_object *), void **csel);
206 int MPIR_Csel_create_from_buf(const char *json,
207                               void *(*create_container) (struct json_object *), void **csel);
208 int MPIR_Csel_free(void *csel);
209 int MPIR_Csel_prune(void *root_csel, MPIR_Comm * comm_ptr, void **comm_csel);
210 void *MPIR_Csel_search(void *csel, MPIR_Csel_coll_sig_s coll_sig);
211 
212 #endif /* MPIR_CSEL_H_INCLUDED */
213