Sunteți pe pagina 1din 2

#include "mpi.

h"
#include <stdio.h>
#include <time.h>
#include <windows.h>
#include <math.h>

/*** PROBLEMA7: Alocarea sarcinilor de serviciu ***/


/*Seful departamentului aloca sarcini de serviciu catre 2
subalterni. Exista un vector cu 30 de elemente intregi,
fiecare valoare fiind numarul de minute necesare indeplinirii
sarcinii respective. Sarcinile se aloca in ordinea din vector,
initial cate una fiecarui subaltern. Cand un subaltern incheie
o sarcina, solicita alta si o primeste pe urmatoarea din vectorul
cunoscut numai de sef. Dupa epuizarea vectorului si realizarea
tuturor sarcinilor, fiecare subaltern scrie cate minute a lucrat.
*/

int main(int argc, char **argv)


{
// Variabile necesare:
int my_id, num_proc;
MPI_Status status;

// Initializare MPI:
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &my_id);
MPI_Comm_size(MPI_COMM_WORLD, &num_proc);

if (!my_id) {
// Instructiuni executate de procesul master (seful departamentului):

int vect[30], var = 400, i, p;

// Se initializeaza valorile vectorului cu sarcini:


for (i = 0; i < 30; i++)
vect[i] = var + ((int) pow(-1.0, rand())) * (rand() % 51);

// Se trimit sarcinile catre procese:


i = 0;
while (i < 30) {
MPI_Recv(&p, 1, MPI_INT, MPI_ANY_SOURCE, 0, MPI_COMM_WORLD,
&status);
MPI_Send(&vect[i], 1, MPI_INT, p, 0, MPI_COMM_WORLD);
i++;
}

// Dupa ce sunt executate toate sarcinile, procesele slave sunt


anuntate ca nu mai exista
// sarcini de executat:
i = 0;
var = 0;
while (i < num_proc - 1) {
MPI_Recv(&p, 1, MPI_INT, MPI_ANY_SOURCE, 0, MPI_COMM_WORLD,
&status);
MPI_Send(&var, 1, MPI_INT, p, 0, MPI_COMM_WORLD);
i++;
}
} else {
// Instructiuni executate de procesele slave:

int durata, total = 0;


do {
MPI_Send(&my_id, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);
MPI_Recv(&durata, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
printf("Proces %d ""lucrez"": %d ms\n", my_id, durata);
Sleep(durata);
total += durata;
} while (durata);
printf("Proces %d: durata = %d ms\n", my_id, total);
}

// Se iese din program:


MPI_Finalize();
return 0;
}

S-ar putea să vă placă și