/** * Generated by pabble-mpi v1.2.1 * Date: Mon Oct 27 12:09:06 2014 */ #include #include #include #include #include #include /*** MPI tags ***/ #define Init 0 #define BeforeLoop 1 #define Dispatch 2 #define Collect 3 #define AfterLoop 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 Farm) **/ 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 *bufDispatch0_r; MPI_Request req0_r; MPI_Status stat0_r; T *bufDispatch0_s; MPI_Request req0_s; MPI_Status stat0_s; T *bufCollect1_r; MPI_Request req1_r; MPI_Status stat1_r; T *bufCollect1_s; MPI_Request req1_s; MPI_Status stat1_s; ts_protocol=MPI_Wtime(); #pragma pabble Init #pragma pabble recur Repeat while (1/*Repeat*/) { #pragma pabble BeforeLoop for (int i = 2; i <= N; i++) { if ( meta.pid == Worker_RANK(i) ) { bufDispatch0_r = calloc(meta.buflen(Dispatch), sizeof(T)); MPI_Irecv(bufDispatch0_r, meta.buflen(Dispatch), MPI_T, /*Worker[1]*/Worker_RANK(1), Dispatch, meta.comm, &req0_r); MPI_Wait(&req0_r, &stat0_r); pabble_recvq_enqueue(Dispatch, bufDispatch0_r); #pragma pabble Dispatch } if ( meta.pid == Worker_RANK(1) ) { #pragma pabble Dispatch bufDispatch0_s = pabble_sendq_dequeue(); MPI_Isend(bufDispatch0_s, meta.buflen(Dispatch), MPI_T, /*Worker[i]*/Worker_RANK(i), Dispatch, meta.comm, &req0_s); MPI_Wait(&req0_s, &stat0_s); free(bufDispatch0_s); } if ( meta.pid == Worker_RANK(1) ) { bufCollect1_r = calloc(meta.buflen(Collect), sizeof(T)); MPI_Irecv(bufCollect1_r, meta.buflen(Collect), MPI_T, /*Worker[i]*/Worker_RANK(i), Collect, meta.comm, &req1_r); MPI_Wait(&req1_r, &stat1_r); pabble_recvq_enqueue(Collect, bufCollect1_r); #pragma pabble Collect } if ( meta.pid == Worker_RANK(i) ) { #pragma pabble Collect bufCollect1_s = pabble_sendq_dequeue(); MPI_Isend(bufCollect1_s, meta.buflen(Collect), MPI_T, /*Worker[1]*/Worker_RANK(1), Collect, meta.comm, &req1_s); MPI_Wait(&req1_s, &stat1_s); free(bufCollect1_s); } } #pragma pabble AfterLoop 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; }