Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <mpi.h>
- #include <math.h>
- #define PRECISION 0.0000001
- #define RANGESIZE 0.1
- #define DATA 0
- #define RESULT 1
- #define FINISH 2
- #define PI 3.14159265359
- //#define DEBUG
- struct moja
- {
- double range1;
- double range2;
- int dlakogo;
- int czyProcessed;
- }kolejka[100];
- int countKolejki = 0;
- void wlozNaKolejke(double wartosc, double wartosc2, int proc)
- {
- kolejka[countKolejki].czyProcessed = 0;
- kolejka[countKolejki].range1 = wartosc;
- kolejka[countKolejki].range2 = wartosc2;
- kolejka[countKolejki].dlakogo = proc;
- countKolejki++;
- }
- int getYourElement(int rank)
- {
- for (int i = 0; i < countKolejki + 1; i++)
- {
- if (kolejka[i].czyProcessed == 0 && kolejka[i].dlakogo == rank)
- {
- kolejka[i].czyProcessed = 1;
- return i;
- }
- }
- return -1;
- }
- double f(double x) {
- return sin(x);
- }
- double SimpleIntegration(double a, double b) {
- double i;
- double sum = 0;
- int liczbaOdebranych = 0;
- for (i = a; i < b; i += PRECISION)
- sum += f(i)*PRECISION;
- return sum;
- }
- int main(int argc, char **argv) {
- int myrank, proccount;
- double a = 1, b = 10*PI;
- double range[2];
- double result = 0, resulttemp;
- int sentcount = 0;
- int receivedcount = 0;
- int i;
- MPI_Status status;
- MPI_Request r;
- // Initialize MPI
- MPI_Init(&argc, &argv);
- // find out my rank
- MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
- // find out the number of processes in MPI_COMM_WORLD
- MPI_Comm_size(MPI_COMM_WORLD, &proccount);
- if (proccount < 2) {
- printf("Run with at least 2 processes");
- MPI_Finalize();
- return -1;
- }
- if (((b - a) / RANGESIZE) < 2 * (proccount - 1)) {
- printf("More subranges needed");
- MPI_Finalize();
- return -1;
- }
- // now the master will distribute the data and slave processes will perform computations
- if (myrank == 0) {
- range[0] = a;
- //moje
- i = 0;
- do
- {
- i++;
- if (i == proccount)
- {
- i = 1;
- }
- range[1] = range[0] + RANGESIZE;
- MPI_Send(&range, 2, MPI_DOUBLE, i, DATA, MPI_COMM_WORLD);
- // printf("Wyslalem range %f,%f do nr: %d\n", range[0], range[1], i);
- wlozNaKolejke(range[0], range[1], i);
- sentcount++;
- range[0] = range[1];
- } while (range[1]+ RANGESIZE < b);
- range[0] = range[1];
- range[1] = b;
- MPI_Send(&range, 2, MPI_DOUBLE, i, DATA, MPI_COMM_WORLD);
- while (sentcount != receivedcount) {
- MPI_Recv(&resulttemp, 1, MPI_DOUBLE, MPI_ANY_SOURCE, RESULT, MPI_COMM_WORLD, &status);
- receivedcount++;
- printf("\nMaster dostal wynik %f from process %d", resulttemp, status.MPI_SOURCE);
- result += resulttemp;
- }
- // shut down the slaves
- for (i = 1; i < proccount; i++) {
- MPI_Send(NULL, 0, MPI_DOUBLE, i, FINISH, MPI_COMM_WORLD);
- }
- // now display the result
- printf("\n\n\n\n\n\n\nHi, I am process 0, the result is %f\n", result);
- }
- else
- {
- double lastEndRange;
- double range3[3];
- int flag = 0;
- do {
- MPI_Iprobe(0, MPI_ANY_TAG, MPI_COMM_WORLD, &flag, &status);
- MPI_Irecv(range3, 2, MPI_DOUBLE, 0, DATA, MPI_COMM_WORLD, &r);
- if (lastEndRange != range3[1])
- {
- // printf("Slave %d received subrange %f %f\n", myrank, range3[0], range3[1]);
- if(range3[0] !=0 && range3[1] != 0)
- wlozNaKolejke(range3[0], range3[1], myrank);
- //licz dziwko
- int indeks = getYourElement(myrank);
- if (indeks != -1)
- {
- resulttemp = SimpleIntegration(kolejka[i].range1, kolejka[i].range2);
- printf("Slave %d sending result %f %f", myrank, range3[0], range3[1]);
- lastEndRange = range3[1];
- MPI_Isend(&resulttemp, 1, MPI_DOUBLE, 0, RESULT, MPI_COMM_WORLD, &r);
- }
- }
- /* for (int i = 0; i<countKolejki; i++)
- {
- if (kolejka[i].dlakogo == myrank)
- {
- printf("Otrzymalem zadanie dla %d\n", myrank);
- }
- }*/
- } while (status.MPI_TAG != FINISH);
- /*
- do {
- MPI_Iprobe(0, MPI_ANY_TAG, MPI_COMM_WORLD, &flag, &status);
- if (status.MPI_TAG == DATA)
- {
- MPI_Irecv(range, 2, MPI_DOUBLE, 0, DATA, MPI_COMM_WORLD, &status);
- printf("Otrzymalem range %f,%f w nr: %d\n", range[0], range[1], myrank);
- //wloz na kolejke
- //oblicz nastepny element ktory nie jest processed
- //odeslij
- // resulttemp = SimpleIntegration(range[0], range[1]);
- }
- }
- while (status.MPI_TAG != FINISH);
- */
- }
- MPI_Finalize();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement