Advertisement
Vita94

Lab3 - OpenMP

May 10th, 2017
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.39 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include <MPI.h>
  4.  
  5. #define MSG_SIZE 1
  6. #define MSG_SUB_ARRAY 2
  7. #define MSG_LOCAL_MINIMUM 3
  8.  
  9. int main(int argc, char* argv[])
  10. {
  11.     int partial, rank, size, arraysize, i;
  12.     float min, temp;
  13.     float* numbers;
  14.     MPI_Status status;
  15.     MPI_Init(&argc, &argv);
  16.     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  17.     MPI_Comm_size(MPI_COMM_WORLD, &size); //number of paralel units
  18.    
  19.     if (rank == 0) //master runs this
  20.     {
  21.         setvbuf(stdout, 0, _IONBF, 0); //no buffering
  22.         printf("size: %d\nrank: %d\n\n", size, rank);
  23.         do
  24.         {
  25.             printf("Duzina niza: ", size - 1);
  26.             scanf("%d", &arraysize);
  27.         } while (arraysize % (size - 1) != 0);
  28.  
  29.         //allocate number of floats
  30.         numbers = (float*)calloc(arraysize, sizeof(float));
  31.  
  32.         printf("Unesi elemente.\n");
  33.  
  34.         for (i = 0; i<arraysize; i++)
  35.         {
  36.             printf("Element #%d: ", i + 1);
  37.             scanf("%f", &numbers[i]);
  38.         }
  39.  
  40.         partial = arraysize / (size - 1); //duzina mini niza
  41.  
  42.         for (i = 1; i<size; i++) //posalji 4 poruke sa duzinom niza
  43.             MPI_Send(&partial, 1, MPI_INT, i, MSG_SIZE, MPI_COMM_WORLD);
  44.  
  45.         for (i = 1; i<size; i++) //posalji 4 poruke sa brojevima koje krecu od (i-1)*partial do partial.
  46.             MPI_Send(numbers + (i - 1)*partial, partial, MPI_FLOAT, i, MSG_SUB_ARRAY, MPI_COMM_WORLD);
  47.  
  48.         //free memory
  49.         free(numbers);
  50.  
  51.         //SADA POCINJE RECEIVE PART
  52.         min = 9999999; //set min number to something big
  53.  
  54.         for (i = 0; i < size - 1; i++)
  55.         {
  56.             MPI_Recv(&temp, 1, MPI_FLOAT, MPI_ANY_SOURCE, MSG_LOCAL_MINIMUM, MPI_COMM_WORLD, &status);
  57.             if (temp < min)
  58.                 min = temp;
  59.         }
  60.  
  61.         printf("Konacni minumum: %.2f\n\n", min);
  62.  
  63.     }
  64.     else //children run this
  65.     {  
  66.         printf("\nRANK: %d\n", rank);
  67.         MPI_Recv(&arraysize, 1, MPI_INT, 0, MSG_SIZE, MPI_COMM_WORLD, &status); //get the sub array length
  68.  
  69.         numbers = (float*)calloc(arraysize, sizeof(float)); //allocate the memory for the array
  70.  
  71.         MPI_Recv(numbers, arraysize, MPI_FLOAT, 0, MSG_SUB_ARRAY, MPI_COMM_WORLD, &status); //get the numbers of subarray
  72.  
  73.         //prikazi brojke
  74.         for (i = 0; i<arraysize; i++)
  75.             printf("%.2f ", numbers[i]);
  76.         printf("\n");
  77.         //nadji minimum
  78.         min = numbers[0];
  79.         for (i = 1; i<arraysize; i++)
  80.             if (numbers[i] < min)
  81.                 min = numbers[i];
  82.  
  83.         printf("Lokalni minimum: %.2f\n", min);
  84.  
  85.         free(numbers);
  86.  
  87.         //send the computation
  88.         MPI_Send(&min, 1, MPI_FLOAT, 0, MSG_LOCAL_MINIMUM, MPI_COMM_WORLD);
  89.     }
  90.  
  91.  
  92.     MPI_Finalize();
  93.  
  94.     return 0;
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement