Maximálnu hodnotu hľadáme na dopredu zvolenej matici 40 čísel následne rozdelenú na 4 časti a každú časť (teda 10 čísel) posielame na vyhodnotenie do jedného procesu. Ostatné charakteristiky nerozdeľujeme na časti, ale posielame v plnom rozsahu. Riešenie problému nie je škálovateľné, teda vyžaduje na svoje správne vyriešenie presne 8 procesov. Program obsahuje aj medzikroky, kde sa počíta doba za akú dané procesy vypočítali čiastkové úseky kódu.
Kód v cpp
#include <stdio.h> #include <mpi.h> #define POCET 40 int main(int argc, char *argv[]) { int cisla[POCET]; int cisla_1[POCET/10]; int cisla_2[POCET/10]; int cisla_3[POCET/10]; int cisla_4[POCET/10]; double t1, t2; int i, size, rank; int n, value_1, value_2; float rval; int max[4]; int rozsah = 10; MPI_Status status; MPI_Request request; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &size); if(size == 8) { MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Bcast(&rozsah, 1, MPI_INT, 0, MPI_COMM_WORLD); if (rank == 0) { cisla[0]=2;cisla[1]=3;cisla[2]=8;cisla[3]=9;cisla[4]=45;cisla[5]=12; cisla[6]=66;cisla[7]=45;cisla[8]=58;cisla[9]=47;cisla[10]=32;cisla[11]=11; cisla[12]=12;cisla[13]=13;cisla[14]=17;cisla[15]=3;cisla[16]=1;cisla[17]=0; cisla[18]=19;cisla[19]=23;cisla[20]=32;cisla[21]=37;cisla[22]=68;cisla[23]=86; cisla[24]=96;cisla[25]=97;cisla[26]=91;cisla[27]=78;cisla[28]=56;cisla[29]=55; cisla[30]=52;cisla[31]=57;cisla[32]=41;cisla[33]=36;cisla[34]=27;cisla[35]=72; cisla[36]=1;cisla[37]=7;cisla[38]=99;cisla[39]=84; printf("\n\n\n Posielanie cisel"); printf("\n -----------------------------"); printf("\n 10 cisel z 0 -> 1"); printf("\n 10 cisel z 0 -> 2"); printf("\n 10 cisel z 0 -> 3"); printf("\n 10 cisel z 0 -> 4"); printf("\n 40 cisel z 0 -> 5,6,7"); } MPI_Bcast(cisla, 40, MPI_INT, 0, MPI_COMM_WORLD); if (rank == 0) { t1 = MPI_Wtime(); if(POCET %4 == 0) { for(i = 0; i < 10; i++) { cisla_1[i] = cisla[i]; } MPI_Send(cisla_1, 10, MPI_INT, 1, 01, MPI_COMM_WORLD); for(i = 10; i < 20; i++) { cisla_2[i-10] = cisla[i]; } MPI_Send(cisla_2, 10, MPI_INT, 2, 02, MPI_COMM_WORLD); for(i = 20; i < 30; i++) { cisla_3[i-20] = cisla[i]; } MPI_Send(cisla_3, 10, MPI_INT, 3, 03, MPI_COMM_WORLD); for(i = 30; i < 40; i++) { cisla_4[i-30] = cisla[i]; } MPI_Send(cisla_4, 10, MPI_INT, 4, 04, MPI_COMM_WORLD); } printf("\n\n\n Vysledky"); printf("\n -----------------------------"); MPI_Recv(&value_1, 1, MPI_INT, 1, 10, MPI_COMM_WORLD, &status); max[0] = value_1; MPI_Recv(&value_1, 1, MPI_INT, 2, 20, MPI_COMM_WORLD, &status); max[1] = value_1; MPI_Recv(&value_1, 1, MPI_INT, 3, 30, MPI_COMM_WORLD, &status); max[2] = value_1; MPI_Recv(&value_1, 1, MPI_INT, 4, 40, MPI_COMM_WORLD, &status); max[3] = value_1; value_1 = 0; for(n = 0; n < 4; n++) { if(value_1 < max[n]) { value_1 = max[n]; } } printf("\n Maximum: %4d (4 casti)", value_1); MPI_Recv(&value_2, 1, MPI_INT, 5, 50, MPI_COMM_WORLD, &status); printf("\n Minimum: %4d", value_2); MPI_Recv(&value_2, 1, MPI_INT, 6, 60, MPI_COMM_WORLD, &status); printf("\n Sucet: %4d", value_2); MPI_Recv(&rval, 1, MPI_FLOAT, 7, 70, MPI_COMM_WORLD, &status); printf("\n Priemer: %f", rval); t2 = MPI_Wtime(); printf("\nvypocet casu (rank 0): %f\n", t2-t1); fflush(stdout); } else if(rank == 1) { t1 = MPI_Wtime(); MPI_Recv(cisla_1, 10, MPI_INT, 0, 01, MPI_COMM_WORLD, &status); value_1 = 0; for(n = 0; n < rozsah; n++) { if(value_1 < cisla_1[n]) { value_1 = cisla_1[n]; } } MPI_Send(&value_1, 1, MPI_INT, 0, 10, MPI_COMM_WORLD); t2 = MPI_Wtime(); printf("vypocet casu (rank 1): %f\n", t2-t1); fflush(stdout); } else if(rank == 2) { t1 = MPI_Wtime(); MPI_Recv(cisla_2, 10, MPI_INT, 0, 02, MPI_COMM_WORLD, &status); value_1 = 0; for(n = 0; n < rozsah; n++) { if(value_1 < cisla_2[n]) { value_1 = cisla_2[n]; } } MPI_Send(&value_1, 1, MPI_INT, 0, 20, MPI_COMM_WORLD); t2 = MPI_Wtime(); printf("vypocet casu (rank 2): %f\n", t2-t1); fflush(stdout); } else if(rank == 3) { t1 = MPI_Wtime(); MPI_Recv(cisla_3, 10, MPI_INT, 0, 03, MPI_COMM_WORLD, &status); value_1 = 0; for(n = 0; n < rozsah; n++) { if (value_1 < cisla_3[n]) { value_1 = cisla_3[n]; } } MPI_Send(&value_1, 1, MPI_INT, 0, 30, MPI_COMM_WORLD); t2 = MPI_Wtime(); printf("vypocet casu (rank 3): %f\n", t2-t1); fflush(stdout); } else if(rank == 4) { t1 = MPI_Wtime(); MPI_Recv(cisla_4, 10, MPI_INT, 0, 04, MPI_COMM_WORLD, &status); value_1 = 0; for(n = 0; n < rozsah; n++) { if(value_1 < cisla_4[n]) { value_1 = cisla_4[n]; } } MPI_Send(&value_1, 1, MPI_INT, 0, 40, MPI_COMM_WORLD); t2 = MPI_Wtime(); printf("vypocet casu (rank 4): %f\n", t2-t1); fflush(stdout); } else if(rank == 5) { t1 = MPI_Wtime(); value_2 = 100; for(n = 0; n < rozsah*4; n++) { if(value_2 > cisla[n]) { value_2 = cisla[n]; } } MPI_Send(&value_2, 1, MPI_INT, 0, 50, MPI_COMM_WORLD); t2 = MPI_Wtime(); printf("vypocet casu (rank 5): %f\n", t2-t1); fflush(stdout); } else if(rank == 6) { t1 = MPI_Wtime(); value_2 = 0; for(n = 0; n < rozsah*4; n++) { value_2 = value_2 + cisla[n]; } MPI_Send(&value_2, 1, MPI_INT, 0, 60, MPI_COMM_WORLD); t2 = MPI_Wtime(); printf("vypocet casu (rank 6): %f\n", t2-t1); fflush(stdout); } else if(rank == 7) { t1 = MPI_Wtime(); value_2 = 0; for(n = 0; n < rozsah*4; n++) { value_2 = value_2 + cisla[n]; } rval = (float) value_2 / 40; MPI_Send(&rval, 1, MPI_FLOAT, 0, 70, MPI_COMM_WORLD); t2 = MPI_Wtime(); printf("vypocet casu (rank 7): %f\n", t2-t1); fflush(stdout); } } MPI_Finalize(); return(0); }