Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Revert "Fix a bug in MBI generators: &com[j] is not &(com[j])"
[simgrid.git] / teshsuite / smpi / MBI / generator_utils.py
1 # Copyright 2021-2022. The MBI project. All rights reserved. 
2 # This program is free software; you can redistribute it and/or modify it under the terms of the license (GNU GPL).
3
4 # This is a simple templating system, dedicated to the systematic generation of MPI source code
5
6 import os
7 import re
8
9 # Collectives
10 coll = ['MPI_Barrier','MPI_Bcast', 'MPI_Reduce', 'MPI_Gather', 'MPI_Scatter', 'MPI_Scan', 'MPI_Exscan', 'MPI_Allgather', 'MPI_Allreduce', 'MPI_Allgatherv', 'MPI_Alltoall', 'MPI_Alltoallv']
11 icoll = ['MPI_Ibcast', 'MPI_Ireduce', 'MPI_Igather', 'MPI_Iscatter', 'MPI_Iscan', 'MPI_Iexscan', 'MPI_Iallgather', 'MPI_Iallreduce', 'MPI_Iallgatherv', 'MPI_Ialltoall', 'MPI_Ialltoallv']
12 ibarrier = ['MPI_Ibarrier']
13 coll4op = ['MPI_Reduce', 'MPI_Allreduce']
14 icoll4op = ['MPI_Ireduce', 'MPI_Iallreduce']
15 coll4root =  ['MPI_Reduce', 'MPI_Bcast', 'MPI_Gather', 'MPI_Scatter']
16 icoll4root = ['MPI_Ireduce', 'MPI_Ibcast', 'MPI_Igather', 'MPI_Iscatter']
17 pcoll = []
18 tcoll = ['MPI_Comm_split', 'MPI_Op_create', 'MPI_Comm_group', 'MPI_Comm_dup', 'MPI_Type_contiguous', 'MPI_Comm_create', 'MPI_Group_excl']
19 tcoll4color = ['MPI_Comm_split'] 
20 tcoll4topo = ['MPI_Cart_get']
21
22 # P2P
23 allsend = ['MPI_Send', 'MPI_Isend', 'MPI_Ssend', 'MPI_Bsend','MPI_Send_init']
24 allrecv = ['MPI_Recv', 'MPI_Irecv', 'MPI_Recv_init'] 
25 send = ['MPI_Send']
26 ssend = ['MPI_Ssend']
27 bsend = ['MPI_Bsend']
28 isend = ['MPI_Isend']
29 psend = ['MPI_Send_init']
30 recv = ['MPI_Recv'] 
31 irecv = ['MPI_Irecv'] 
32 precv = ['MPI_Recv_init'] 
33 probe = ['MPI_Probe']
34
35 # RMA
36 epoch = ['MPI_Win_fence', 'MPI_Win_lock', 'MPI_Win_lock_all']
37 rma = ['MPI_Get', 'MPI_Put']
38 get = ['MPI_Get']
39 rget = ['MPI_RGet']
40 put = ['MPI_Put'] 
41 rput = ['MPI_RPut'] 
42 store = ['store']
43 load = ['load']
44 rstore = ['rstore']
45 rload = ['rload']
46 loadstore = ['loadstore']
47
48
49 # setup
50 init = {}
51 start = {}
52 operation = {}
53 fini = {}
54 free = {} 
55 write = {}
56 error = {}
57 epoch = {}
58 finEpoch = {}
59
60
61 ### COLL:basic
62
63 init['MPI_Bcast'] = lambda n: f'int buf{n}[buff_size];'
64 start['MPI_Bcast'] = lambda n: ""
65 operation['MPI_Bcast'] = lambda n: f'MPI_Bcast(buf{n}, buff_size, type, root, newcom);'
66 fini['MPI_Bcast'] = lambda n: ""
67 free['MPI_Bcast'] = lambda n: ""
68 write['MPI_Bcast'] = lambda n: ""
69
70 init['MPI_Barrier'] = lambda n: ""
71 start['MPI_Barrier'] = lambda n: ""
72 operation['MPI_Barrier'] = lambda n: 'MPI_Barrier(newcom);'
73 fini['MPI_Barrier'] = lambda n: ""
74 free['MPI_Barrier'] = lambda n: ""
75 write['MPI_Barrier'] = lambda n: ""
76
77 init['MPI_Reduce'] = lambda n: f"int sum{n}, val{n} = 1;"
78 start['MPI_Reduce'] = lambda n: ""
79 operation['MPI_Reduce'] = lambda n: f"MPI_Reduce(&val{n}, &sum{n}, 1, type, op, root, newcom);"
80 fini['MPI_Reduce'] = lambda n: ""
81 free['MPI_Reduce'] = lambda n: ""
82 write['MPI_Reduce'] = lambda n: ""
83
84 init['MPI_Gather'] = lambda n: f"int val{n}=1, buf{n}[buff_size];"
85 start['MPI_Gather'] = lambda n: ""
86 operation['MPI_Gather'] = lambda n: f"MPI_Gather(&val{n}, 1, type, buf{n},1, type, root, newcom);"
87 fini['MPI_Gather'] = lambda n: ""
88 free['MPI_Gather'] = lambda n: ""
89 write['MPI_Gather'] = lambda n: ""
90
91 init['MPI_Scatter'] = lambda n: f"int val{n}, buf{n}[buff_size];"
92 start['MPI_Scatter'] = lambda n: ""
93 operation['MPI_Scatter'] = lambda n: f"MPI_Scatter(&buf{n}, 1, type, &val{n}, 1, type, root, newcom);"
94 fini['MPI_Scatter'] = lambda n: ""
95 free['MPI_Scatter'] = lambda n: ""
96 write['MPI_Scatter'] = lambda n: ""
97
98 init['MPI_Allreduce'] = lambda n: f"int sum{n}, val{n} = 1;"
99 start['MPI_Allreduce'] = lambda n: ""
100 operation['MPI_Allreduce'] = lambda n: f"MPI_Allreduce(&val{n}, &sum{n}, 1, type, op, newcom);"
101 fini['MPI_Allreduce'] = lambda n: ""
102 free['MPI_Allreduce'] = lambda n: ""
103 write['MPI_Allreduce'] = lambda n: ""
104
105 init['MPI_Scan'] = lambda n: f"int outbuf{n}[buff_size], inbuf{n}[buff_size];"
106 start['MPI_Scan'] = lambda n: ""
107 operation['MPI_Scan'] = lambda n: f"MPI_Scan(&outbuf{n}, inbuf{n}, buff_size, type, op, newcom);"
108 fini['MPI_Scan'] = lambda n: ""
109 free['MPI_Scan'] = lambda n: ""
110 write['MPI_Scan'] = lambda n: ""
111
112 init['MPI_Exscan'] = lambda n: f"int outbuf{n}[buff_size], inbuf{n}[buff_size];"
113 start['MPI_Exscan'] = lambda n: ""
114 operation['MPI_Exscan'] = lambda n: f"MPI_Exscan(&outbuf{n}, inbuf{n}, buff_size, type, op, newcom);"
115 fini['MPI_Exscan'] = lambda n: ""
116 free['MPI_Exscan'] = lambda n: ""
117 write['MPI_Exscan'] = lambda n: ""
118
119 init['MPI_Allgather'] = lambda n: f"int val{n}=1, *rbuf{n} = (int*)malloc(dbs);"
120 start['MPI_Allgather'] = lambda n: "" 
121 operation['MPI_Allgather'] = lambda n: f"MPI_Allgather(&val{n}, 1, type, rbuf{n}, 1, type, newcom);"
122 fini['MPI_Allgather'] = lambda n: ""
123 free['MPI_Allgather'] = lambda n: f"free(rbuf{n});" 
124 write['MPI_Allgather'] = lambda n: "" 
125
126 init['MPI_Alltoallv'] = lambda n: (f"int *sbuf{n}=(int*)malloc(dbs*2), *rbuf{n}=(int*)malloc(dbs*2), *scounts{n}=(int*)malloc(dbs), *rcounts{n}=(int*)malloc(dbs), *sdispls{n}=(int*)malloc(dbs), *rdispls{n}=(int*)malloc(dbs);\n"
127   +  "  for (int i = 0; i < nprocs; i++) {\n"
128   + f"    scounts{n}[i] = 2;\n"
129   + f"    rcounts{n}[i] = 2;\n"
130   + f"    sdispls{n}[i] = (nprocs - (i + 1)) * 2;\n"
131   + f"    rdispls{n}[i] = i * 2;\n"
132   +  "  }")
133 start['MPI_Alltoallv'] = lambda n: "" 
134 operation['MPI_Alltoallv'] = lambda n: f"MPI_Alltoallv(sbuf{n}, scounts{n}, sdispls{n}, type, rbuf{n}, rcounts{n}, rdispls{n}, type, newcom);"
135 fini['MPI_Alltoallv'] = lambda n: "" 
136 free['MPI_Alltoallv'] = lambda n: f"free(sbuf{n});free(rbuf{n});free(scounts{n});free(rcounts{n});free(sdispls{n});free(rdispls{n});"
137 write['MPI_Alltoallv'] = lambda n: "" 
138
139 init['MPI_Alltoall'] = lambda n: f"int *sbuf{n} = (int*)malloc(dbs), *rbuf{n} = (int*)malloc(dbs);"
140 start['MPI_Alltoall'] = lambda n: "" 
141 operation['MPI_Alltoall'] = lambda n: f"MPI_Alltoall(sbuf{n}, 1, type, rbuf{n}, 1, type, newcom);"
142 fini['MPI_Alltoall'] = lambda n: "" 
143 free['MPI_Alltoall'] = lambda n: f"free(sbuf{n});free(rbuf{n});"
144 write['MPI_Alltoall'] = lambda n: "" 
145
146 init['MPI_Allgatherv'] = lambda n: (f"int *rbuf{n} = (int*)malloc(dbs*2), *rcounts{n}=(int*)malloc(dbs),  *displs{n}=(int*)malloc(dbs);\n" 
147   +  "  for (int i = 0; i < nprocs; i++) {\n"
148   + f"    rcounts{n}[i] = 1;\n"
149   + f"    displs{n}[i] = 2 * (nprocs - (i + 1));\n"
150   +  "  }")
151 start['MPI_Allgatherv'] = lambda n: "" 
152 operation['MPI_Allgatherv'] = lambda n: f"MPI_Allgatherv(&rank, 1, type, rbuf{n}, rcounts{n}, displs{n}, type, newcom);"
153 fini['MPI_Allgatherv'] = lambda n: "" 
154 free['MPI_Allgatherv'] = lambda n: f"free(rbuf{n});free(rcounts{n});free(displs{n});"
155 write['MPI_Allgatherv'] = lambda n: "" 
156
157
158 ### COLL:nonblocking
159
160 init['MPI_Ibarrier'] = lambda n: f"MPI_Request req{n}=MPI_REQUEST_NULL; MPI_Status stat{n};"
161 start['MPI_Ibarrier'] = lambda n: ""
162 operation['MPI_Ibarrier'] = lambda n: f'MPI_Ibarrier(newcom, &req{n});'
163 fini['MPI_Ibarrier'] = lambda n: f"MPI_Wait(&req{n}, &stat{n});"
164 free['MPI_Ibarrier'] = lambda n: f'if(req{n} != MPI_REQUEST_NULL) MPI_Request_free(&req{n});'
165 write['MPI_Ibarrier'] = lambda n: ""
166
167 init['MPI_Ireduce'] = lambda n: f"MPI_Request req{n}=MPI_REQUEST_NULL; MPI_Status stat{n}; int sum{n}, val{n} = 1;"
168 start['MPI_Ireduce'] = lambda n: ""
169 operation['MPI_Ireduce'] = lambda n: f"MPI_Ireduce(&val{n}, &sum{n}, 1, type, op, root, newcom, &req{n});"
170 fini['MPI_Ireduce'] = lambda n: f"MPI_Wait(&req{n}, &stat{n});" 
171 free['MPI_Ireduce'] = lambda n: f'if(req{n} != MPI_REQUEST_NULL) MPI_Request_free(&req{n});'
172 write['MPI_Ireduce'] = lambda n: f"sum{n}++;"
173
174 init['MPI_Iallreduce'] = lambda n: f'MPI_Request req{n}=MPI_REQUEST_NULL;MPI_Status stat{n}; int sum{n}, val{n} = 1;'
175 start['MPI_Iallreduce'] = lambda n: ""
176 operation['MPI_Iallreduce'] = lambda n: f'MPI_Iallreduce(&val{n}, &sum{n}, 1, type, op, newcom, &req{n});'
177 fini['MPI_Iallreduce'] = lambda n: f'MPI_Wait(&req{n}, &stat{n});'
178 free['MPI_Iallreduce'] = lambda n: f"if(req{n} != MPI_REQUEST_NULL) MPI_Request_free(&req{n});"
179 write['MPI_Iallreduce'] = lambda n: f"sum{n}++;"
180
181 init['MPI_Ibcast'] = lambda n: f'MPI_Request req{n}=MPI_REQUEST_NULL; MPI_Status sta{n};int buf{n}[buff_size];'
182 start['MPI_Ibcast'] = lambda n: ""
183 operation['MPI_Ibcast'] = lambda n: f'MPI_Ibcast(buf{n}, buff_size, type, root, newcom, &req{n});'
184 fini['MPI_Ibcast'] = lambda n: f"MPI_Wait(&req{n},&sta{n});"
185 free['MPI_Ibcast'] = lambda n: f'if(req{n} != MPI_REQUEST_NULL) MPI_Request_free(&req{n});'
186 write['MPI_Ibcast'] = lambda n: f'buf{n}[0]++;'
187
188 init['MPI_Igather'] = lambda n: f"int val{n}=1, buf{n}[buff_size];MPI_Request req{n}=MPI_REQUEST_NULL;MPI_Status sta{n};"
189 start['MPI_Igather'] = lambda n: "" 
190 operation['MPI_Igather'] = lambda n: f'MPI_Igather(&val{n}, 1, type, &buf{n},1, type, root, newcom, &req{n});'
191 write['MPI_Igather'] = lambda n: f'val{n}=3;'
192 fini['MPI_Igather'] = lambda n: f'MPI_Wait(&req{n},&sta{n});'
193 free['MPI_Igather'] = lambda n: f'if(req{n} != MPI_REQUEST_NULL) MPI_Request_free(&req{n});' 
194
195 init['MPI_Iscatter'] = lambda n: f"MPI_Request req{n}=MPI_REQUEST_NULL;MPI_Status sta{n};int val{n}, buf{n}[buff_size];"
196 start['MPI_Iscatter'] = lambda n: ""
197 operation['MPI_Iscatter'] = lambda n: f"MPI_Iscatter(&buf{n}, 1, type, &val{n}, 1, type, root, newcom,&req{n});"
198 fini['MPI_Iscatter'] = lambda n: f"MPI_Wait(&req{n},&sta{n});"
199 free['MPI_Iscatter'] = lambda n: f'if(req{n} != MPI_REQUEST_NULL) MPI_Request_free(&req{n});'
200 write['MPI_Iscatter'] = lambda n: f'buf{n}[0]++;'
201
202 init['MPI_Iscan'] = lambda n: f"MPI_Request req{n}=MPI_REQUEST_NULL;MPI_Status sta{n}; int outbuf{n}[buff_size], inbuf{n}[buff_size];"
203 start['MPI_Iscan'] = lambda n: ""
204 operation['MPI_Iscan'] = lambda n: f"MPI_Iscan(&outbuf{n}, inbuf{n}, buff_size, type, op, newcom,&req{n});"
205 fini['MPI_Iscan'] = lambda n: f"MPI_Wait(&req{n},&sta{n});"
206 free['MPI_Iscan'] = lambda n: f'if(req{n} != MPI_REQUEST_NULL) MPI_Request_free(&req{n});'
207 write['MPI_Iscan'] = lambda n: f'outbuf{n}[0]++;'
208
209 init['MPI_Iexscan'] = lambda n: f"MPI_Request req{n}=MPI_REQUEST_NULL;MPI_Status sta{n};int outbuf{n}[buff_size], inbuf{n}[buff_size];"
210 start['MPI_Iexscan'] = lambda n: ""
211 operation['MPI_Iexscan'] = lambda n: f"MPI_Iexscan(&outbuf{n}, inbuf{n}, buff_size, type, op, newcom,&req{n});"
212 fini['MPI_Iexscan'] = lambda n: f"MPI_Wait(&req{n},&sta{n});"
213 free['MPI_Iexscan'] = lambda n: f'if(req{n} != MPI_REQUEST_NULL) MPI_Request_free(&req{n});'
214 write['MPI_Iexscan'] = lambda n: f'outbuf{n}[0]++;'
215
216 init['MPI_Iallgather'] = lambda n: f"MPI_Request req{n}=MPI_REQUEST_NULL;MPI_Status sta{n};int val{n}=1, *rbuf{n} = (int*)malloc(dbs);"
217 start['MPI_Iallgather'] = lambda n: "" 
218 operation['MPI_Iallgather'] = lambda n: f"MPI_Iallgather(&val{n}, 1, type, rbuf{n}, 1, type, newcom,&req{n});"
219 fini['MPI_Iallgather'] = lambda n: f"MPI_Wait(&req{n},&sta{n});"
220 free['MPI_Iallgather'] = lambda n: f"free(rbuf{n});" 
221 write['MPI_Iallgather'] = lambda n: f'val{n}++;'
222
223 init['MPI_Iallgatherv'] = lambda n: (f"MPI_Request req{n}=MPI_REQUEST_NULL;MPI_Status sta{n};int *rbuf{n} = (int*)malloc(dbs*2), *rcounts{n}=(int*)malloc(dbs),  *displs{n}=(int*)malloc(dbs);\n" 
224   +  "  for (int i = 0; i < nprocs; i++) {\n"
225   + f"    rcounts{n}[i] = 1;\n"
226   + f"    displs{n}[i] = 2 * (nprocs - (i + 1));\n"
227   +  "  }")
228 start['MPI_Iallgatherv'] = lambda n: "" 
229 operation['MPI_Iallgatherv'] = lambda n: f"MPI_Iallgatherv(&rank, 1, type, rbuf{n}, rcounts{n}, displs{n}, type, newcom,&req{n});"
230 fini['MPI_Iallgatherv'] = lambda n: f"MPI_Wait(&req{n},&sta{n});" 
231 free['MPI_Iallgatherv'] = lambda n: f"free(rbuf{n});free(rcounts{n});free(displs{n});"
232 write['MPI_Iallgatherv'] = lambda n: f"rbuf{n}[0]++;" 
233
234 init['MPI_Ialltoall'] = lambda n: f"MPI_Request req{n}=MPI_REQUEST_NULL;MPI_Status sta{n};int *sbuf{n} = (int*)malloc(dbs), *rbuf{n} = (int*)malloc(dbs);"
235 start['MPI_Ialltoall'] = lambda n: "" 
236 operation['MPI_Ialltoall'] = lambda n: f"MPI_Ialltoall(sbuf{n}, 1, type, rbuf{n}, 1, type, newcom, &req{n});"
237 fini['MPI_Ialltoall'] = lambda n: f"MPI_Wait(&req{n},&sta{n});"
238 free['MPI_Ialltoall'] = lambda n: f"free(sbuf{n});free(rbuf{n});"
239 write['MPI_Ialltoall'] = lambda n: f"rbuf{n}[0]++;"
240
241 init['MPI_Ialltoallv'] = lambda n: (f"MPI_Request req{n}=MPI_REQUEST_NULL;MPI_Status sta{n};int *sbuf{n}=(int*)malloc(dbs*2), *rbuf{n}=(int*)malloc(dbs*2), *scounts{n}=(int*)malloc(dbs), *rcounts{n}=(int*)malloc(dbs), *sdispls{n}=(int*)malloc(dbs), *rdispls{n}=(int*)malloc(dbs);\n"
242   +  "  for (int i = 0; i < nprocs; i++) {\n"
243   + f"    scounts{n}[i] = 2;\n"
244   + f"    rcounts{n}[i] = 2;\n"
245   + f"    sdispls{n}[i] = (nprocs - (i + 1)) * 2;\n"
246   + f"    rdispls{n}[i] = i * 2;\n"
247   +  "  }")
248 start['MPI_Ialltoallv'] = lambda n: "" 
249 operation['MPI_Ialltoallv'] = lambda n: f"MPI_Ialltoallv(sbuf{n}, scounts{n}, sdispls{n}, type, rbuf{n}, rcounts{n}, rdispls{n}, type, newcom,&req{n});"
250 fini['MPI_Ialltoallv'] = lambda n: f"MPI_Wait(&req{n},&sta{n});"
251 free['MPI_Ialltoallv'] = lambda n: f"free(sbuf{n});free(rbuf{n});free(scounts{n});free(rcounts{n});free(sdispls{n});free(rdispls{n});"
252 write['MPI_Ialltoallv'] = lambda n: f"rbuf{n}[0]++;"
253
254 ### COLL:persistent
255
256
257
258 ### COLL:tools
259
260 init['MPI_Comm_split'] = lambda n: f'MPI_Comm com[size]; color = rank % 2; int key = 1;'
261 start['MPI_Comm_split'] = lambda n: ""
262 operation['MPI_Comm_split'] = lambda n: 'MPI_Comm_split(MPI_COMM_WORLD,color,key, &com[j]);'
263 error['MPI_Comm_split'] = 'CommunicatorLeak'
264 fini['MPI_Comm_split'] = lambda n: "if(com[j] != MPI_COMM_NULL) MPI_Comm_free(&com[j]);"
265 free['MPI_Comm_split'] = lambda n: ""
266
267
268 init['MPI_Cart_get'] = lambda n: ""
269 start['MPI_Cart_get'] = lambda n: ""
270 operation['MPI_Cart_get'] = lambda n: f'MPI_Cart_get(newcom, 2, dims, periods, coords);'
271 write['MPI_Cart_get'] = lambda n: ""
272 fini['MPI_Cart_get'] = lambda n: ""
273 free['MPI_Cart_get'] = lambda n: ""
274
275
276 init['MPI_Op_create'] = lambda n: 'MPI_Op op[size];'
277 operation['MPI_Op_create'] = lambda n: 'MPI_Op_create((MPI_User_function *)myOp, 0, &op[j]);'
278 error['MPI_Op_create'] = 'OperatorLeak'
279 fini['MPI_Op_create'] = lambda n: "MPI_Op_free(&op[j]);"
280 free['MPI_Op_create'] = lambda n: ""
281
282 init['MPI_Comm_group'] = lambda n: 'MPI_Group grp[size];'
283 operation['MPI_Comm_group'] = lambda n: 'MPI_Comm_group(MPI_COMM_WORLD, &grp[j]);'
284 error['MPI_Comm_group'] = 'GroupLeak'
285 fini['MPI_Comm_group'] = lambda n: "MPI_Group_free(&grp[j]);"
286 free['MPI_Comm_group'] = lambda n: "" 
287
288 init['MPI_Group_excl'] = lambda n: 'MPI_Group worldgroup, grp[size];\n MPI_Comm_group(MPI_COMM_WORLD, &worldgroup);'
289 operation['MPI_Group_excl'] = lambda n: 'MPI_Group_excl(worldgroup, 1, &rank, &grp[j]);' 
290 error['MPI_Group_excl'] = 'GroupLeak'
291 fini['MPI_Group_excl'] = lambda n: "MPI_Group_free(&grp[j]);"
292 free['MPI_Group_excl'] = lambda n: "MPI_Group_free(&worldgroup);"
293
294 init['MPI_Comm_create'] = lambda n: 'MPI_Comm com[size]; MPI_Group grp[size];'
295 operation['MPI_Comm_create'] = lambda n: 'MPI_Comm_group(MPI_COMM_WORLD, &grp[j]);\n MPI_Comm_create(MPI_COMM_WORLD, grp[j], &com[j]);\n MPI_Group_free(&grp[j]);'
296 error['MPI_Comm_create'] = 'CommunicatorLeak'
297 fini['MPI_Comm_create'] = lambda n: "MPI_Comm_free(&com[j]);"
298 free['MPI_Comm_create'] = lambda n: ""
299
300 init['MPI_Comm_dup'] = lambda n: f'MPI_Comm com[size];'
301 operation['MPI_Comm_dup'] = lambda n: 'MPI_Comm_dup(MPI_COMM_WORLD, &com[j]);'
302 error['MPI_Comm_dup'] = 'CommunicatorLeak'
303 fini['MPI_Comm_dup'] = lambda n: "MPI_Comm_free(&com[j]);"
304 free['MPI_Comm_dup'] = lambda n: "" 
305
306 init['MPI_Type_contiguous'] = lambda n: 'MPI_Datatype type[size];'
307 operation['MPI_Type_contiguous'] = lambda n: 'MPI_Type_contiguous(2, MPI_DOUBLE, &type[j]);'
308 error['MPI_Type_contiguous'] = 'TypeLeak'
309 fini['MPI_Type_contiguous'] = lambda n: "MPI_Type_free(&type[j]);"
310 free['MPI_Type_contiguous'] = lambda n: "" 
311
312
313
314
315 ### P2P:basic 
316
317 init['MPI_Send'] = lambda n: f'int buf{n}=rank;'
318 start['MPI_Send'] = lambda n: ""
319 operation['MPI_Send'] = lambda n: f'MPI_Send(&buf{n}, buff_size, type, dest, stag, newcom);'
320 fini['MPI_Send'] = lambda n: ""
321 free['MPI_Send'] = lambda n: ""
322 write['MPI_Send'] = lambda n: ""
323
324 init['MPI_Ssend'] = lambda n: f'int buf{n}=rank;'
325 start['MPI_Ssend'] = lambda n: ""
326 operation['MPI_Ssend'] = lambda n: f'MPI_Ssend(&buf{n}, buff_size, type, dest, stag, newcom);'
327 fini['MPI_Ssend'] = lambda n: ""
328 free['MPI_Ssend'] = lambda n: ""
329 write['MPI_Ssend'] = lambda n: ""
330
331 init['MPI_Bsend'] = lambda n: (f'int buf{n}=rank;\n'
332             + f'int buffer_attached_size{n} = MPI_BSEND_OVERHEAD + sizeof(int);\n' 
333             + f'char* buffer_attached{n} = (char*)malloc(buffer_attached_size{n});\n'
334             + f'MPI_Buffer_attach(buffer_attached{n}, buffer_attached_size{n});')
335 start['MPI_Bsend'] = lambda n: ""
336 operation['MPI_Bsend'] = lambda n: f'MPI_Bsend(&buf{n}, buff_size, type, dest, stag, newcom);'
337 fini['MPI_Bsend'] = lambda n: ""
338 free['MPI_Bsend'] = (lambda n: f'MPI_Buffer_detach(&buffer_attached{n}, &buffer_attached_size{n});\n'
339             + f'free(buffer_attached{n});')
340 write['MPI_Bsend'] = lambda n: ""
341
342 init['MPI_Recv'] = lambda n: f'int buf{n}=-1; MPI_Status sta{n};'
343 start['MPI_Recv'] = lambda n: ""
344 operation['MPI_Recv'] = lambda n: f'MPI_Recv(&buf{n}, buff_size, type, src, rtag, newcom, &sta{n});'
345 fini['MPI_Recv'] = lambda n: ""
346 free['MPI_Recv'] = lambda n: ""
347 write['MPI_Recv'] = lambda n: ""
348
349 init['MPI_Probe'] = lambda n: ""
350 start['MPI_Probe'] = lambda n: ""
351 operation['MPI_Probe'] = lambda n: f'MPI_Probe(src, 0, newcom, &sta);'
352 fini['MPI_Probe'] = lambda n: ""
353 free['MPI_Probe'] = lambda n: ""
354 write['MPI_Probe'] = lambda n: ""
355
356
357
358 ### P2P:nonblocking
359
360 init['MPI_Isend'] = lambda n: f'int buf{n}=rank; MPI_Request req{n}=MPI_REQUEST_NULL;'
361 start['MPI_Isend'] = lambda n: "" 
362 operation['MPI_Isend'] = lambda n: f'MPI_Isend(&buf{n}, buff_size, type, dest, stag, newcom, &req{n});'
363 fini['MPI_Isend'] = lambda n: f'MPI_Wait(&req{n}, MPI_STATUS_IGNORE);'
364 free['MPI_Isend'] = lambda n: f'if(req{n} != MPI_REQUEST_NULL) MPI_Request_free(&req{n});'
365 write['MPI_Isend'] = lambda n: f'buf{n}=4;'
366
367 init['MPI_Irecv'] = lambda n: f'int buf{n}=-1; MPI_Request req{n}=MPI_REQUEST_NULL;'
368 start['MPI_Irecv'] = lambda n: "" 
369 operation['MPI_Irecv'] = lambda n: f'MPI_Irecv(&buf{n}, buff_size, type, src, rtag, newcom, &req{n});'
370 fini['MPI_Irecv'] = lambda n: f' MPI_Wait(&req{n}, MPI_STATUS_IGNORE);'
371 free['MPI_Irecv'] = lambda n: f'if(req{n} != MPI_REQUEST_NULL) MPI_Request_free(&req{n});'
372 write['MPI_Irecv'] = lambda n: f'buf{n}++;' 
373
374 ### P2P:persistent
375
376 init['MPI_Send_init'] = lambda n: f'int buf{n}=rank; MPI_Request req{n}=MPI_REQUEST_NULL;'
377 operation['MPI_Send_init'] = lambda n: f'MPI_Send_init(&buf{n}, buff_size, type, dest, stag, newcom, &req{n});' 
378 start['MPI_Send_init'] = lambda n: f'MPI_Start(&req{n});'
379 fini['MPI_Send_init'] = lambda n: f'MPI_Wait(&req{n}, MPI_STATUS_IGNORE);'
380 free['MPI_Send_init'] = lambda n: f'if(req{n} != MPI_REQUEST_NULL) MPI_Request_free(&req{n});'
381 write['MPI_Send_init'] = lambda n: f'buf{n}=4;' 
382
383 init['MPI_Recv_init'] = lambda n: f'int buf{n}=-1; MPI_Request req{n}=MPI_REQUEST_NULL;'
384 start['MPI_Recv_init'] = lambda n: f'MPI_Start(&req{n});'
385 operation['MPI_Recv_init'] = lambda n: f'MPI_Recv_init(&buf{n}, buff_size, type, src, rtag, newcom, &req{n});'
386 fini['MPI_Recv_init'] = lambda n: f'MPI_Wait(&req{n}, MPI_STATUS_IGNORE);'
387 free['MPI_Recv_init'] = lambda n: f'if(req{n} != MPI_REQUEST_NULL) MPI_Request_free(&req{n});'
388 write['MPI_Recv_init'] = lambda n: f'buf{n}++;' 
389
390 ### RMA
391
392 epoch['MPI_Win_fence'] =lambda n: 'MPI_Win_fence(0, win);'
393 finEpoch['MPI_Win_fence'] =lambda n: 'MPI_Win_fence(0, win);'
394 epoch['MPI_Win_lock'] =lambda n: 'MPI_Win_lock(MPI_LOCK_SHARED, target, 0, win);'
395 finEpoch['MPI_Win_lock'] =lambda n: 'MPI_Win_unlock(target, win);'
396 epoch['MPI_Win_lock_all'] =lambda n: 'MPI_Win_lock_all(0,win);'
397 finEpoch['MPI_Win_lock_all'] =lambda n: 'MPI_Win_unlock_all(win);'
398
399 init['MPI_Put'] = lambda n: f'int localbuf{n} = 12345;'
400 operation['MPI_Put'] = lambda n: f'MPI_Put(&localbuf{n}, N, MPI_INT, target, 0, N, type, win);'
401
402 init['MPI_RPut'] = lambda n: "" 
403 operation['MPI_RPut'] = lambda n: f'MPI_Put(&winbuf[20], N, MPI_INT, target, 0, N, type, win);'
404
405 init['MPI_Get'] = lambda n: f'int localbuf{n} = 54321;'
406 operation['MPI_Get'] = lambda n: f'MPI_Get(&localbuf{n}, N, MPI_INT, target, 0, N, type, win);' 
407
408 init['MPI_RGet'] = lambda n: ""
409 operation['MPI_RGet'] = lambda n: f'MPI_Get(&winbuf[20], N, MPI_INT, target, 0, N, type, win);' 
410
411 init['store'] = lambda n: f'int localbuf{n} = 0;'
412 operation['store'] = lambda n: f'localbuf{n} = 8;'
413
414 init['rstore'] = lambda n: ""
415 operation['rstore'] = lambda n: f'winbuf[20] = 12346;'
416
417 init['load'] = lambda n: f'int localbuf{n} = 0;'
418 operation['load'] = lambda n: f'int load = localbuf{n};'
419
420 init['rload'] = lambda n: "" 
421 operation['rload'] = lambda n: "int load = winbuf[20];"
422
423 init['loadstore'] = lambda n: f'int localbuf{n} = 0;'
424 operation['loadstore'] = lambda n: f'if (localbuf{n} % 2 == 0)  localbuf{n}++; '
425
426
427
428
429 def find_line(content, target, filename):
430     res = 1
431     for line in content.split('\n'):
432         if re.search(f'[^:]{target}', line):
433             #print(f'Found {target} at {line}')
434             return res
435         res += 1
436     raise Exception(f"Line target {target} not found in {filename}.")
437
438
439 def make_file(template, filename, replace):
440     output = template
441     filename = re.sub("_MPI_", "_", filename)
442     replace['filename'] = filename
443     # Replace all variables that don't have a ':' in their name
444     while re.search("@\{[^@:]*\}@", output):
445         m = re.search("@\{([^@:]*)\}@", output)
446         target = m.group(1)
447         #print(f"Replace @{{{target}}}@")
448         if target in replace.keys():
449             output = re.sub(f'@\{{{target}\}}@', replace[target], output)
450             #print(f"Replace {target} -> {replace[target]}")
451         else:
452             raise Exception(f"Variable {target} used in template, but not defined.")
453     # Now replace all variables with a ':' in their name: line targets are like that, and we don't want to resolve them before the others change the lines
454     while re.search("@\{([^:@]*):([^@]*)\}@", output):
455         m = re.search("@\{([^:@]*):([^@]*)\}@", output)
456         (kind, target) = (m.group(1), m.group(2))
457         if kind == 'line':
458             replace = f'{find_line(output, target, filename)}'
459             #print(f"Replace @{{line:{target}}}@ with '{replace}'")
460             output = re.sub(f'@\{{line:{target}\}}@', replace, output)
461         else:
462             raise Exception(f"Unknown variable kind: {kind}:{target}")
463
464     if os.path.exists(filename):
465         with open(filename, 'r') as file:
466             prev = file.read().split('\n')[0]
467             prev = re.sub('^.*?scripts/','scripts/', prev)
468             prev = re.sub('. DO NOT EDIT.', '', prev)
469         now = output.split('\n')[0]
470         now = re.sub('^.*?scripts/','scripts/', now)
471         now = re.sub('. DO NOT EDIT.', '', now)
472
473         print(f'WARNING: overwriting {filename}. Previously generated by: {prev}; regenerated by {now}')
474
475     # Ready to output it
476     with open(filename, 'w') as outfile:
477         outfile.write(output)