YauhenMardan

Untitled

Oct 14th, 2019
261
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.48 KB | None | 0 0
  1. //
  2. // main.cpp
  3. // CA-Lab2
  4. //
  5. // Created by Zhenya Mordan on 9/16/19.
  6. // Copyright © 2019 Zhenya Mordan. All rights reserved.
  7. //
  8.  
  9. #include "mpi.h"
  10. #include <iostream>
  11. #include <fstream>
  12. using namespace std;
  13.  
  14. void read(const char* ,int*& , int& );
  15. void write(const char* ,int* , int );
  16. void merge(int *, int *, int, int, int);
  17. void mergeSort(int *, int *, int, int);
  18.  
  19. int main(int argc, char** argv) {
  20.  
  21. //init original array
  22. int n;
  23. int *original_array;
  24. //read array
  25. read(argv[1], original_array, n);
  26.  
  27. //init mpi
  28. int world_rank;
  29. int world_size;
  30.  
  31. MPI_Init(&argc, &argv);
  32. MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
  33. MPI_Comm_size(MPI_COMM_WORLD, &world_size);
  34.  
  35. //divide the array in equal-sized chunks
  36. int size = n/world_size;
  37.  
  38. //send each subarray to each process
  39. int *sub_array = new int [size];
  40. MPI_Scatter(original_array, size, MPI_INT, sub_array, size, MPI_INT, 0, MPI_COMM_WORLD);
  41.  
  42. //mergesort on each process
  43.  
  44. int *tmp_array = new int [size];
  45. mergeSort(sub_array, tmp_array, 0, (size - 1));
  46.  
  47. //gather the sorted subarrays into one
  48. int *sorted = NULL;
  49. if(world_rank == 0) {
  50.  
  51. sorted = new int [n];
  52.  
  53. }
  54.  
  55. MPI_Gather(sub_array, size, MPI_INT, sorted, size, MPI_INT, 0, MPI_COMM_WORLD);
  56.  
  57. //make the final mergeSort call
  58. if(world_rank == 0) {
  59.  
  60. int *other_array = new int [n];
  61. mergeSort(sorted, other_array, 0, (n - 1));
  62.  
  63. //write sorted array
  64. write(argv[2], sorted, n);
  65.  
  66. //clean up root
  67. delete [] sorted;
  68. delete [] other_array;
  69.  
  70. }
  71.  
  72. //clean up rest
  73. delete [] original_array;
  74. delete [] sub_array;
  75. delete [] tmp_array;
  76.  
  77. //finalize MPI
  78. MPI_Barrier(MPI_COMM_WORLD);
  79. MPI_Finalize();
  80.  
  81. //print runtime
  82. if(world_rank==0){
  83. cout << "Total time = " << clock()/1000.0 << endl;
  84. }
  85. }
  86.  
  87. void write(const char* filename,int* array, int n){
  88. ofstream ofile(filename);
  89.  
  90. cout<< "Writting array...\n";
  91. if(ofile.is_open()){
  92. for(int i=0;i<n;){
  93. ofile<<array[i++]<<"\n";
  94. }
  95. }
  96. ofile.close();
  97. }
  98. void read(const char* filename,int*& array, int &n){
  99.  
  100. ifstream ifile(filename);
  101.  
  102. ifile>>n;
  103.  
  104. array = new int [n];
  105.  
  106. if(ifile.is_open()){
  107. for(int i=0;i<n;i++){
  108. ifile>>array[i];
  109. }
  110. }
  111. ifile.close();
  112. }
  113.  
  114. void merge(int *a, int *b, int l, int m, int r) {
  115.  
  116. int h, i, j, k;
  117. h = l;
  118. i = l;
  119. j = m + 1;
  120.  
  121. while((h <= m) && (j <= r)) {
  122. if(a[h] <= a[j]) {
  123.  
  124. b[i] = a[h];
  125. h++;
  126.  
  127. }
  128. else {
  129.  
  130. b[i] = a[j];
  131. j++;
  132. }
  133. i++;
  134. }
  135. if(m < h) {
  136. for(k = j; k <= r; k++) {
  137. b[i] = a[k];
  138. i++;
  139. }
  140. }
  141. else {
  142. for(k = h; k <= m; k++) {
  143. b[i] = a[k];
  144. i++;
  145. }
  146. }
  147.  
  148. for(k = l; k <= r; k++) {
  149.  
  150. a[k] = b[k];
  151.  
  152. }
  153.  
  154. }
  155.  
  156. void mergeSort(int *a, int *b, int l, int r) {
  157.  
  158. int m;
  159.  
  160. if(l < r) {
  161.  
  162. m = (l + r)/2;
  163.  
  164. mergeSort(a, b, l, m);
  165. mergeSort(a, b, (m + 1), r);
  166. merge(a, b, l, m, r);
  167.  
  168. }
  169.  
  170. }
Advertisement
Add Comment
Please, Sign In to add comment