#include #include #include #include #include #include #include #include #include int main(int argc, char *argv[]){ int id, p, n, ln, i, j, retCode; double *buffer; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &p); MPI_Comm_rank(MPI_COMM_WORLD, &id); n = strtol(argv[1],NULL,10); // total number of elements to be distributed ln = n/p; // local number of elements buffer = (double*)calloc(ln, sizeof(double)); if (id == p-1) // Process p-1 send to other processes { for (i=0; i< p-1; i++) { fprintf(stdout, "Process %d is sending %d elements to process %d\n", p-1, ln, i); retCode = MPI_Ssend (buffer, ln, MPI_DOUBLE, i, 0, MPI_COMM_WORLD); if(retCode) fprintf(stdout, "MPISend error at file %s, line %d code %d\n", __FILE__, __LINE__, retCode); fprintf(stdout, "Process %d completed sending to process %d\n", p-1, i); } } else // other processes receive from process p-1 { fprintf(stdout, "Process %d is receiving %d elements from process %d\n", id, ln,p-1); retCode = MPI_Recv (buffer, ln, MPI_DOUBLE, p-1, MPI_ANY_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE); if(retCode) fprintf(stdout, "MPI_Recv error at file %s, line %d code %d\n", __FILE__, __LINE__, retCode); fprintf(stdout, "Process %d received from process %d\n", id, p-1); } free(buffer); MPI_Finalize(); return 0; }