SHARE
TWEET

Untitled

a guest Oct 21st, 2019 71 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top