/* * mpich5.c * $Id$ * * Copyright (C) 2007 Andrew Smirnoff * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * */ #include #include #include #include "mpi.h" #define PERPROC 4 int main(int argc, char *argv[]) { int numproc; int rank; int *va; int sum1, sum2; int buf[PERPROC]; int i,j,k; int res; int max; MPI_Status status; srandom(time(NULL)); MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &numproc); if (numproc < 3) { fprintf(stderr, "Process count must be greater that 3!\n"); MPI_Finalize(); exit(0); } MPI_Comm_rank(MPI_COMM_WORLD, &rank); if (rank == 0) { va = (int *)malloc(numproc * PERPROC * sizeof(int)); for (i = 0; i < numproc * PERPROC; i++) va[i] = random() % 100; printf ("va = "); for (i = 0; i < numproc * PERPROC; i++) printf("%d ", va[i]); printf("\n"); fflush(stdin); printf("Sending vectors to processes...\n"); fflush(stdin); k = 1; for(i = 1 ; i < numproc; i++) { for(j = 0; j < PERPROC; j++) buf[j] = va[i*PERPROC + j]; MPI_Send(buf, PERPROC, MPI_INT, i, 0, MPI_COMM_WORLD); } max = va[0]; for (i = 1; i < PERPROC; i++) { MPI_Sendrecv(&max, 1, MPI_INT, 1, 0, &res, 1, MPI_INT, numproc - 1, 0, MPI_COMM_WORLD, &status); if (va[i] > res) res = va[i]; if (res > max) max = res; } for (i = 0; i < numproc - 1; i++) { MPI_Recv(&res, 1, MPI_INT, numproc - 1, 0, MPI_COMM_WORLD, &status); if (res > max) max = res; } printf("Sending done!\nGetting result...\n"); fflush(stdin); sum1 = va[0]; for (i = 0; i < numproc * PERPROC; i++) if (sum1 < va[i]) sum1 = va[i]; printf("Result: %d (%d)\n", max, sum1); } else { MPI_Recv(buf, PERPROC, MPI_INT, 0, 0, MPI_COMM_WORLD, &status); printf("%d: va: ", rank); for (i = 0; i < PERPROC; i++) printf("%d ", buf[i]); printf("\n"); fflush(stdout); max = buf[0]; for (i = 1; i < PERPROC; i++) { MPI_Sendrecv(&max, 1, MPI_INT, (rank + 1 >= numproc) ? 0 : rank + 1, 0, &res, 1, MPI_INT, rank - 1, 0, MPI_COMM_WORLD, &status); if (buf[i]> res) res = buf[i]; if (res > max) max = res; } for (i = 0; i < rank - 1; i++) { MPI_Sendrecv(&max, 1, MPI_INT, (rank + 1 >= numproc) ? 0 : rank + 1, 0, &res, 1, MPI_INT, rank - 1, 0, MPI_COMM_WORLD, &status); if (res > max) max = res; } MPI_Send(&max, 1, MPI_INT, (rank + 1 >= numproc) ? 0 : rank + 1, 0, MPI_COMM_WORLD); } if (rank == 0) free(va); MPI_Finalize(); return 0; }