Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<stdlib.h>
- #include <MPI.h>
- #define MSG_SIZE 1
- #define MSG_SUB_ARRAY 2
- #define MSG_LOCAL_MINIMUM 3
- int main(int argc, char* argv[])
- {
- int partial, rank, size, arraysize, i;
- float min, temp;
- float* numbers;
- MPI_Status status;
- MPI_Init(&argc, &argv);
- MPI_Comm_rank(MPI_COMM_WORLD, &rank);
- MPI_Comm_size(MPI_COMM_WORLD, &size); //number of paralel units
- if (rank == 0) //master runs this
- {
- setvbuf(stdout, 0, _IONBF, 0); //no buffering
- printf("size: %d\nrank: %d\n\n", size, rank);
- do
- {
- printf("Duzina niza: ", size - 1);
- scanf("%d", &arraysize);
- } while (arraysize % (size - 1) != 0);
- //allocate number of floats
- numbers = (float*)calloc(arraysize, sizeof(float));
- printf("Unesi elemente.\n");
- for (i = 0; i<arraysize; i++)
- {
- printf("Element #%d: ", i + 1);
- scanf("%f", &numbers[i]);
- }
- partial = arraysize / (size - 1); //duzina mini niza
- for (i = 1; i<size; i++) //posalji 4 poruke sa duzinom niza
- MPI_Send(&partial, 1, MPI_INT, i, MSG_SIZE, MPI_COMM_WORLD);
- for (i = 1; i<size; i++) //posalji 4 poruke sa brojevima koje krecu od (i-1)*partial do partial.
- MPI_Send(numbers + (i - 1)*partial, partial, MPI_FLOAT, i, MSG_SUB_ARRAY, MPI_COMM_WORLD);
- //free memory
- free(numbers);
- //SADA POCINJE RECEIVE PART
- min = 9999999; //set min number to something big
- for (i = 0; i < size - 1; i++)
- {
- MPI_Recv(&temp, 1, MPI_FLOAT, MPI_ANY_SOURCE, MSG_LOCAL_MINIMUM, MPI_COMM_WORLD, &status);
- if (temp < min)
- min = temp;
- }
- printf("Konacni minumum: %.2f\n\n", min);
- }
- else //children run this
- {
- printf("\nRANK: %d\n", rank);
- MPI_Recv(&arraysize, 1, MPI_INT, 0, MSG_SIZE, MPI_COMM_WORLD, &status); //get the sub array length
- numbers = (float*)calloc(arraysize, sizeof(float)); //allocate the memory for the array
- MPI_Recv(numbers, arraysize, MPI_FLOAT, 0, MSG_SUB_ARRAY, MPI_COMM_WORLD, &status); //get the numbers of subarray
- //prikazi brojke
- for (i = 0; i<arraysize; i++)
- printf("%.2f ", numbers[i]);
- printf("\n");
- //nadji minimum
- min = numbers[0];
- for (i = 1; i<arraysize; i++)
- if (numbers[i] < min)
- min = numbers[i];
- printf("Lokalni minimum: %.2f\n", min);
- free(numbers);
- //send the computation
- MPI_Send(&min, 1, MPI_FLOAT, 0, MSG_LOCAL_MINIMUM, MPI_COMM_WORLD);
- }
- MPI_Finalize();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement