/** * Generated by pabble-mpi v1.2.1 * Date: Mon Oct 27 15:57:26 2014 */ #include #include #include #include #include #include /*** MPI tags ***/ #define Init 0 #define PreRing 1 #define Process 2 #define ProcessN 3 #define PostRing 4 #define Finish 5 #define Worker_RANK(x) (0+((x)-(1))) extern meta_t meta; int main(int argc, char *argv[]) { double ts_overall=0.0, ts_protocol=0.0; MPI_Init(&argc, &argv); ts_overall = MPI_Wtime(); meta.comm = MPI_COMM_WORLD; MPI_Comm_rank(MPI_COMM_WORLD, &meta.pid); MPI_Comm_size(MPI_COMM_WORLD, &meta.nprocs); MPI_Group world_grp; MPI_Comm_group(MPI_COMM_WORLD, &world_grp); /** Declarations (Protocol Ring) **/ int N = ((int) pow((double)meta.nprocs, 1/1)); MPI_Barrier(MPI_COMM_WORLD); /* Protocol begin */ #pragma pabble type T typedef void T; MPI_Datatype MPI_T = MPI_BYTE; T *bufProcess0_r; MPI_Request req0_r; MPI_Status stat0_r; T *bufProcess0_s; MPI_Request req0_s; MPI_Status stat0_s; T *bufProcessN1_r; MPI_Request req1_r; MPI_Status stat1_r; T *bufProcessN1_s; MPI_Request req1_s; MPI_Status stat1_s; ts_protocol=MPI_Wtime(); #pragma pabble Init #pragma pabble recur Loop while (1/*Loop*/) { #pragma pabble PreRing for (int i = 1; i <= (N-1); i++) { if ( Worker_RANK(2) <= meta.pid && meta.pid <= Worker_RANK(N) ) { bufProcess0_r = calloc(meta.buflen(Process), sizeof(T)); MPI_Irecv(bufProcess0_r, meta.buflen(Process), MPI_T, /*Worker[(i-1)]*/(meta.pid-1), Process, meta.comm, &req0_r); MPI_Wait(&req0_r, &stat0_r); pabble_recvq_enqueue(Process, bufProcess0_r); #pragma pabble Process } if ( Worker_RANK(1) <= meta.pid && meta.pid <= Worker_RANK((N-1)) ) { #pragma pabble Process bufProcess0_s = pabble_sendq_dequeue(); MPI_Isend(bufProcess0_s, meta.buflen(Process), MPI_T, /*Worker[(i+1)]*/(meta.pid+1), Process, meta.comm, &req0_s); MPI_Wait(&req0_s, &stat0_s); free(bufProcess0_s); } if ( meta.pid == Worker_RANK(1) ) { bufProcessN1_r = calloc(meta.buflen(ProcessN), sizeof(T)); MPI_Irecv(bufProcessN1_r, meta.buflen(ProcessN), MPI_T, /*Worker[N]*/Worker_RANK(N), ProcessN, meta.comm, &req1_r); MPI_Wait(&req1_r, &stat1_r); pabble_recvq_enqueue(ProcessN, bufProcessN1_r); #pragma pabble ProcessN } if ( meta.pid == Worker_RANK(N) ) { #pragma pabble ProcessN bufProcessN1_s = pabble_sendq_dequeue(); MPI_Isend(bufProcessN1_s, meta.buflen(ProcessN), MPI_T, /*Worker[1]*/Worker_RANK(1), ProcessN, meta.comm, &req1_s); MPI_Wait(&req1_s, &stat1_s); free(bufProcessN1_s); } } #pragma pabble PostRing continue; break; } #pragma pabble Finish MPI_Barrier(MPI_COMM_WORLD); /* Protocol end */ ts_protocol=MPI_Wtime()-ts_protocol; ts_overall=MPI_Wtime()-ts_overall; MPI_Finalize(); if (meta.pid==0) fprintf(stderr, "Protocol=%fs Overall=%f\n", ts_protocol, ts_overall); return EXIT_SUCCESS; }