Advertisement
Guest User

Untitled

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