Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- int main(int argc, char* argv[])
- {
- int* data;
- int* blk;
- int* temp;
- int m, n = N;
- int id = 0, p;
- int s = 0;
- int i;
- int step;
- MPI_Status status;
- MPI_Init(&argc, &argv);
- MPI_Comm_rank(MPI_COMM_WORLD, &id);
- MPI_Comm_size(MPI_COMM_WORLD, &p);
- startT = MPI_Wtime();
- int r;
- srand(MPI_Wtime());
- s = n / p;
- r = n%p;
- data = (int*)malloc((n + s - r) * sizeof(int));
- for (i = 0; i < n; i++)
- data[i] = rand();
- if (r != 0)
- {
- for (i = n; i < n + s - r; i++)
- data[i] = 0;
- s++;
- }
- if (id == MASTER)
- {
- MPI_Bcast(&s, 1, MPI_INT, 0, MPI_COMM_WORLD);
- blk = (int*)malloc(s * sizeof(int));
- MPI_Scatter(data, s, MPI_INT,blk, s, MPI_INT, 0, MPI_COMM_WORLD);
- merge_sort(blk, 0, s - 1);
- }
- else
- {
- MPI_Bcast(&s, 1, MPI_INT, 0, MPI_COMM_WORLD);
- blk = (int*)malloc(s * sizeof(int));
- MPI_Scatter(data, s, MPI_INT, blk, s, MPI_INT, 0, MPI_COMM_WORLD);
- merge_sort(blk, 0, s - 1);
- }
- step = 1;
- while (step < p)
- {
- if (id % (2 * step) == 0)
- {
- if (id + step < p)
- {
- MPI_Recv(&m, 1, MPI_INT, id + step, 0, MPI_COMM_WORLD, &status);
- temp = new int[m];
- MPI_Recv(temp, m, MPI_INT, id + step, 0, MPI_COMM_WORLD, &status);
- blk = merge(blk, s, temp, m);
- s += m;
- }
- }
- else
- {
- int near = id - step;
- MPI_Send(&s, 1, MPI_INT, near, 0, MPI_COMM_WORLD);
- MPI_Send(blk, s, MPI_INT, near, 0, MPI_COMM_WORLD);
- break;
- }
- step *= 2;
- }
- stopT = MPI_Wtime();
- printf("%d; %d processors; %f scecs\n", s, p, (stopT - startT));
- MPI_Finalize();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement