Advertisement
Guest User

Untitled

a guest
Oct 16th, 2019
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.15 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <pthread.h>
  4. #include <math.h>
  5. #define MIN(a,b) (a < b ? a : b)
  6. int NReps;
  7. int printLevel;
  8. int N;
  9. int* v;
  10. int *vQSort;
  11. int *vNew;
  12. int P;
  13. pthread_barrier_t barrier;
  14.  
  15.  
  16. void merge(int source[], int start, int mid, int end, int destination[]) {
  17. // DO NOT MODIFY
  18. int iA = start;
  19. int iB = mid;
  20. int i;
  21.  
  22. for (i = start; i < end; i++)
  23. {
  24. if (end == iB || (iA < mid && source[iA] <= source[iB])) {
  25. destination[i] = source[iA];
  26. iA++;
  27. } else {
  28. destination[i] = source[iB];
  29. iB++;
  30. }
  31. }
  32. }
  33.  
  34. void compareVectors(int * a, int * b) {
  35. // DO NOT MODIFY
  36. int i;
  37. for(i = 0; i < N; i++) {
  38. if(a[i]!=b[i]) {
  39. printf("Sorted incorrectly\n");
  40. return;
  41. }
  42. }
  43. printf("Sorted correctly\n");
  44. }
  45.  
  46. void displayVector(int * v) {
  47. // DO NOT MODIFY
  48. int i;
  49. int displayWidth = 2 + log10(v[N-1]);
  50. for(i = 0; i < N; i++) {
  51. printf("%*i", displayWidth, v[i]);
  52. if(!((i+1) % 20))
  53. printf("\n");
  54. }
  55. printf("\n");
  56. }
  57.  
  58. int cmp(const void *a, const void *b) {
  59. // DO NOT MODIFY
  60. int A = *(int*)a;
  61. int B = *(int*)b;
  62. return A-B;
  63. }
  64.  
  65.  
  66. void getArgs(int argc, char **argv)
  67. {
  68. if(argc < 5) {
  69. printf("Not enough paramters: ./program N NReps printLevel P\n");
  70. exit(1);
  71. }
  72. N = atoi(argv[1]);
  73. NReps = atoi(argv[2]);
  74. printLevel = atoi(argv[3]);
  75. P = atoi(argv[4]);
  76. }
  77.  
  78. void init()
  79. {
  80. int i;
  81. v = malloc(sizeof(int) * N);
  82. vQSort = malloc(sizeof(int) * N);
  83. vNew = malloc(sizeof(int) * N);
  84. if(v == NULL) {
  85. printf("malloc failed!");
  86. exit(1);
  87. }
  88.  
  89. // generate the vector v with random values
  90. // DO NOT MODIFY
  91. srand(42);
  92. for(i = 0; i < N; i++)
  93. v[i] = rand()%N;
  94. }
  95.  
  96. void printPartial()
  97. {
  98. compareVectors(v, vQSort);
  99. }
  100.  
  101. void printAll()
  102. {
  103. displayVector(v);
  104. displayVector(vQSort);
  105. compareVectors(v, vQSort);
  106. }
  107.  
  108. void print()
  109. {
  110. if(printLevel == 0)
  111. return;
  112. else if(printLevel == 1)
  113. printPartial();
  114. else
  115. printAll();
  116. }
  117.  
  118. void* threadFunction(void *var)
  119. {
  120. int thread_id = *(int*)var;
  121.  
  122. int start_raw = thread_id * ceil((double)N/P);
  123. int end_raw = MIN(N, (thread_id+1) * ceil((double)N/P));
  124. int i;
  125. int width, *aux;
  126. for (width = 1; width < N; width = 2 * width) {
  127. int ok = 0;
  128. int start = start_raw/2/width*2*width;
  129. int end = end_raw/2/width*2*width;
  130. for (i = start; i < end; i = i + 2 * width) {
  131. merge(v, i, i + width, i + 2 * width, vNew);
  132. ok = 1;
  133. }
  134. pthread_barrier_wait(&barrier);
  135. if (thread_id == 0){
  136. aux = v;
  137. v = vNew;
  138. vNew = aux;
  139. }
  140. pthread_barrier_wait(&barrier);
  141. }
  142.  
  143.  
  144. }
  145.  
  146. int main(int argc, char *argv[])
  147. {
  148. int i, j;
  149. getArgs(argc, argv);
  150. init();
  151.  
  152. // make copy to check it against qsort
  153. // DO NOT MODIFY
  154. for(i = 0; i < N; i++)
  155. vQSort[i] = v[i];
  156. qsort(vQSort, N, sizeof(int), cmp);
  157.  
  158. pthread_t tid[P];
  159. int thread_id[P];
  160. for(i = 0;i < P; i++)
  161. thread_id[i] = i;
  162. int num_threads = P;
  163. pthread_barrier_init(&barrier, NULL, num_threads);
  164.  
  165. for(i = 0; i < P; i++) {
  166. pthread_create(&(tid[i]), NULL, threadFunction, &(thread_id[i]));
  167. }
  168.  
  169. for(i = 0; i < P; i++) {
  170. pthread_join(tid[i], NULL);
  171. }
  172.  
  173. pthread_barrier_destroy(&barrier);
  174.  
  175. print();
  176.  
  177. return 0;
  178. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement