24 #define MPI_Comm_rank PMPI_Comm_rank 25 #define MPI_Comm_size PMPI_Comm_size 26 #define MPI_Gather PMPI_Gather 27 #define MPI_Scatter PMPI_Scatter 28 #define MPI_Bcast PMPI_Bcast 29 #define MPI_Barrier PMPI_Barrier 30 #define MPI_Comm_split PMPI_Comm_split 31 #define MPI_Send PMPI_Send 32 #define MPI_Recv PMPI_Recv 37 #include <sys/types.h> 53 int _sion_register_callbacks_mpi() {
55 aid=sion_generic_create_api(
"SIONlib_MPI_API");
58 sion_generic_register_create_local_commgroup_cb(aid,&_sion_mpi_create_lcg_cb);
59 sion_generic_register_free_local_commgroup_cb(aid,&_sion_mpi_free_lcg_cb);
61 sion_generic_register_barrier_cb(aid,&_sion_mpi_barrier_cb);
62 sion_generic_register_bcastr_cb(aid,&_sion_mpi_bcastr_cb);
63 sion_generic_register_gatherr_cb(aid,&_sion_mpi_gatherr_cb);
64 sion_generic_register_scatterr_cb(aid,&_sion_mpi_scatterr_cb);
65 sion_generic_register_gathervr_cb(aid,&_sion_mpi_gathervr_cb);
66 sion_generic_register_scattervr_cb(aid,&_sion_mpi_scattervr_cb);
67 sion_generic_register_gather_and_execute_cb(aid,&_sion_mpi_gather_process_cb);
68 sion_generic_register_execute_and_scatter_cb(aid,&_sion_mpi_process_scatter_cb);
69 sion_generic_register_get_capability_cb(aid,&_sion_mpi_get_capability_cb);
74 int _sion_mpi_create_lcg_cb(
void **local_commgroup,
void *global_commgroup,
77 int filenumber,
int numfiles
84 DPRINTFP((256,
"_mpi_create_lcg_cb", grank,
" split now comm: grank=%d gsize=%d filenumber=%d, numfiles=%d, lrank=%d lsize=%d \n",
85 grank, gsize, filenumber, numfiles, lrank, lsize));
87 if(global_commgroup==NULL) {
88 fprintf(stderr,
"_mpi_create_lcg_cb: error no global commgroup given, aborting ...\n");
91 if(*local_commgroup!=NULL) {
92 fprintf(stderr,
"_mpi_create_lcg_cb: error local commgroup already initialized, aborting ...\n");
97 if(sapi_global->lcommgroup!=NULL) {
99 *local_commgroup=sapi_global->lcommgroup;
104 if (commgroup == NULL) {
105 fprintf(stderr,
"_mpi_create_lcg_cb: cannot allocate memory for local commgroup of size %lu, aborting ...\n",
110 rc = MPI_Comm_split(sapi_global->comm, filenumber, lrank, &commgroup->comm);
111 DPRINTFP((256,
"_mpi_create_lcg_cb", grank,
" rc=%d from MPI_Comm_split\n",rc));
112 commgroup->local=1; commgroup->commset=1; commgroup->lcommgroup=NULL;
113 commgroup->commcreated=1;
114 commgroup->rank=lrank;
115 commgroup->size=lsize;
117 *local_commgroup=commgroup;
118 sapi_global->lcommgroup=commgroup;
124 int _sion_mpi_free_lcg_cb(
void *local_commgroup) {
128 if ( (commgroup->commset) && (commgroup->commcreated) ) {
129 DPRINTFP((256,
"_mpi_free_lcg_cb", commgroup->rank,
" free now comm\n"));
130 rc=MPI_Comm_free(&commgroup->comm);
131 DPRINTFP((256,
"_mpi_free_lcg_cb", commgroup->rank,
" free now comm rc=%d\n",rc));
137 int _sion_mpi_barrier_cb(
void *commdata)
141 MPI_Comm commp = sapi->comm;
142 rc = MPI_Barrier(commp);
146 int _sion_mpi_bcastr_cb(
void *data,
void *commdata,
int dtype,
int nelem,
int root)
150 MPI_Comm commp = sapi->comm;
153 rc = MPI_Bcast((sion_int32 *) data, nelem, SION_MPI_INT32, root, commp);
156 rc = MPI_Bcast((sion_int64 *) data, nelem, SION_MPI_INT64, root, commp);
159 rc = MPI_Bcast((
char *) data, nelem, MPI_CHAR, root, commp);
162 rc = MPI_Bcast((sion_int64 *) data, nelem, SION_MPI_INT64, root, commp);
168 int _sion_mpi_gatherr_cb(
void *indata,
void *outdata,
void *commdata,
int dtype,
int nelem,
int root)
173 MPI_Comm commp = sapi->comm;
175 MPI_Comm_rank(commp, &rank);
176 MPI_Comm_size(commp, &size);
178 DPRINTFP((256,
"_mpi_gatherr_cb", rank,
" gatherr on %d of %d nelem=%d root=%d\n", rank, size, nelem, root));
183 rc = MPI_Gather((sion_int32 *) indata, nelem, SION_MPI_INT32, (sion_int32 *) outdata, nelem, SION_MPI_INT32, root, commp);
186 rc = MPI_Gather((sion_int64 *) indata, nelem, SION_MPI_INT64, (sion_int64 *) outdata, nelem, SION_MPI_INT64, root, commp);
189 rc = MPI_Gather((
char *) indata, nelem, MPI_CHAR, (
char *) outdata, nelem, MPI_CHAR, root, commp);
192 rc = MPI_Gather((sion_int64 *) indata, nelem, SION_MPI_INT64, (sion_int64 *) outdata, nelem, SION_MPI_INT64, root, commp);
200 int _sion_mpi_scatterr_cb(
void *indata,
void *outdata,
void *commdata,
int dtype,
int nelem,
int root)
204 MPI_Comm commp = sapi->comm;
208 DPRINTFP((256,
"_mpi_scatterr_cb", rank,
" starting nelem=%d root=%d\n", nelem, root));
211 for(t=0;t<nelem*size;t++) {
212 DPRINTFP((256,
"_mpi_scatterr_cb", rank,
" before scatter: %d -> %d\n", t,(
int) ((
int *) indata)[t]));
218 rc = MPI_Scatter((sion_int32 *) indata, nelem, SION_MPI_INT32, (sion_int32 *) outdata, nelem, SION_MPI_INT32, root, commp);
221 rc = MPI_Scatter((sion_int64 *) indata, nelem, SION_MPI_INT64, (sion_int64 *) outdata, nelem, SION_MPI_INT64, root, commp);
224 rc = MPI_Scatter((
char *) indata, nelem, MPI_CHAR, (
char *) outdata, nelem, MPI_CHAR, root, commp);
227 rc = MPI_Scatter((sion_int64 *) indata, nelem, SION_MPI_INT64, (sion_int64 *) outdata, nelem, SION_MPI_INT64, root, commp);
234 int _sion_mpi_gathervr_cb(
void *indata,
void *outdata,
void *commdata,
int dtype,
int *counts,
int nelem,
int root)
237 int size, rank, t, offset;
240 MPI_Comm commp = sapi->comm;
243 MPI_Comm_rank(commp, &rank);
244 MPI_Comm_size(commp, &size);
246 DPRINTFP((256,
"_mpi_gathervr_cb", rank,
" input nelem=%d root=%d indata=%x, outdata=%x\n", nelem, root, indata, outdata));
250 displs = (
int *) malloc(size *
sizeof(
int));
251 if (displs == NULL) {
252 fprintf(stderr,
"_mpi_gathervr_cb: cannot allocate temporary memory of size %lu (displs), aborting ...\n",(
unsigned long) size *
sizeof(
int));
256 for(t=0;t<size;t++) {
259 DPRINTFP((256,
"_mpi_gathervr_cb", rank,
" after MPI_Gather %2d -> dpls=%2d count=%d\n", t,displs[t],counts[t]));
266 rc = MPI_Gatherv((sion_int32 *) indata, nelem, SION_MPI_INT32, (sion_int32 *) outdata, counts, displs, SION_MPI_INT32, root, commp);
269 rc = MPI_Gatherv((sion_int64 *) indata, nelem, SION_MPI_INT64, (sion_int64 *) outdata, counts, displs, SION_MPI_INT64, root, commp);
272 rc = MPI_Gatherv((
char *) indata, nelem, MPI_CHAR, (sion_int32 *) outdata, counts, displs, MPI_CHAR, root, commp);
275 rc = MPI_Gatherv((sion_int64 *) indata, nelem, SION_MPI_INT64, (sion_int64 *) outdata, counts, displs, SION_MPI_INT64, root, commp);
280 if(displs) free(displs);
285 int _sion_mpi_scattervr_cb(
void *indata,
void *outdata,
void *commdata,
int dtype,
int *counts,
int nelem,
int root)
288 int size, rank, t, offset;
291 MPI_Comm commp = sapi->comm;
294 MPI_Comm_rank(commp, &rank);
295 MPI_Comm_size(commp, &size);
297 DPRINTFP((256,
"_mpi_scattervr_cb", rank,
" input nelem=%d root=%d\n", nelem, root));
301 displs = (
int *) malloc(size *
sizeof(
int));
302 if (displs == NULL) {
303 fprintf(stderr,
"_mpi_scattervr_cb: cannot allocate temporary memory of size %lu (displs), aborting ...\n",(
unsigned long) size *
sizeof(
int));
307 for(t=0;t<size;t++) {
310 DPRINTFP((256,
"_mpi_scattervr_cb", rank,
" after MPI_Gather %2d -> dpls=%2d sendcounts=%d\n", t,displs[t],counts[t]));
317 rc = MPI_Scatterv((sion_int32 *) outdata, counts, displs, SION_MPI_INT32, (sion_int32 *) indata, nelem, SION_MPI_INT32, root, commp);
320 rc = MPI_Scatterv((sion_int64 *) outdata, counts, displs, SION_MPI_INT64, (sion_int64 *) indata, nelem, SION_MPI_INT64, root, commp);
323 rc = MPI_Scatterv((
char *) outdata, counts, displs, MPI_CHAR, (sion_int32 *) indata, nelem, MPI_CHAR, root, commp);
326 rc = MPI_Scatterv((sion_int64 *) outdata, counts, displs, SION_MPI_INT64, (sion_int64 *) indata, nelem, SION_MPI_INT64, root, commp);
331 if(displs) free(displs);