Advertisement
Guest User

Untitled

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