Advertisement
Guest User

Untitled

a guest
Apr 19th, 2015
244
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.35 KB | None | 0 0
  1. /**
  2. * \file parallel-mergesort.cc
  3. *
  4. * \brief Implement your parallel mergesort in this file.
  5. */
  6.  
  7. #include <assert.h>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <strings.h>
  12.  
  13. #include "sort.hh"
  14.  
  15. void parallelSort (int N, keytype* A)
  16. {
  17. /* Lucky you, you get to start from scratch */
  18. /*omp_set_num_threads(64);*/
  19. #pragma omp parallel
  20. #pragma omp master
  21. pmergeSort(A, N);
  22. }
  23.  
  24. int binarySearch(keytype x, keytype* A2, int sizeA2){
  25. int first = 0;
  26. int last = sizeA2 - 1;
  27. int mid;
  28. if(sizeA2 > 0){
  29. while(first<last){
  30. mid = (first+last)/2;
  31. if(x <= A2[mid]){
  32. last = mid;
  33. }
  34. else{
  35. first = mid + 1;
  36. }
  37. }
  38. }
  39. return last;
  40. }
  41.  
  42. void pmerge(keytype* A1, int sizeA1, keytype* A2, int sizeA2, keytype* orig){
  43. assertIsSorted(sizeA1, A1);
  44. assertIsSorted(sizeA2, A2);
  45.  
  46. int halfA = sizeA1/2;
  47. keytype x = A1[halfA];
  48. int k = binarySearch(x, A2, sizeA2);
  49.  
  50.  
  51. keytype* A11 = newCopy(halfA, A1);
  52. keytype* A12 = newCopy((sizeA1-halfA), A1+halfA);
  53. keytype* A21 = newCopy(k, A2);
  54. keytype* A22 = newCopy((sizeA2-k), A2+k);
  55.  
  56. #pragma omp task
  57. pmerge(A11, halfA, A21, k, A1);
  58. pmerge(A12, (sizeA1-halfA), A22, (sizeA2-k), A2);
  59. #pragma omp taskwait
  60.  
  61. int i = 0;
  62. int j = 0;
  63. #pragma omp task
  64. #pragma omp parallel for shared(A1)
  65. for(i=0; i < sizeA1; i++){
  66. orig[i] = A1[i];
  67. }
  68. #pragma omp parallel for shared(A2)
  69. for(j = 0; j < sizeA2; j++){
  70. orig[j+sizeA1] = A2[j];
  71. }
  72. #pragma omp taskwait
  73.  
  74. free((keytype *)A11);
  75. free((keytype *)A12);
  76. free((keytype *)A21);
  77. free((keytype *)A22);
  78. }
  79.  
  80. void pmergeSort(keytype* A, int len){
  81. if(len <= 1){
  82. return;
  83. }
  84. else{
  85. int i = 0;
  86. int q = len/2;
  87. int qq = len - q;
  88.  
  89. keytype* A1, A2;
  90. #pragma omp task
  91. A1 = newCopy(q,A);
  92. A2 = newCopy(qq,A+q);
  93. #pragma omp taskwait
  94.  
  95. /*#pragma omp parallel for shared(A, A1) private (i)
  96. for(i = p; i < q; i++){
  97. A1[i] = A[i];
  98. }
  99. #pragma omp parallel for shared(A, A2) private (i)
  100. for(i = q+1; i < N; i++){
  101. A2[i] = A[i];
  102. }*/
  103.  
  104. #pragma omp task
  105. pmergeSort(A1, q);
  106. pmergeSort(A2, qq);
  107. #pragma omp taskwait
  108.  
  109. pmerge(A1, q, A2, qq, A);
  110. free((keytype *)A1);
  111. free((keytype *)A2);
  112. }
  113. }
  114.  
  115.  
  116. /* eof */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement