Advertisement
Knogle

Benchmark

Oct 21st, 2018
186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.59 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <pthread.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5.  
  6. void quicksort (int *A, int len);
  7.  
  8. #define MIN_LENGTH 4
  9.  
  10. int DEBUG;
  11.  
  12. typedef struct
  13. {
  14.   int *array;
  15.   int left;
  16.   int right;
  17.   int tid;
  18. } thread_data_t;
  19.  
  20. int number_of_threads;
  21. pthread_mutex_t lock_number_of_threads;
  22.  
  23. int
  24. my_comp (const void *larg, const void *rarg)
  25. {
  26.   int l = *(int *) larg;
  27.   int r = *(int *) rarg;
  28.   if (l < r)
  29.     {
  30.       return -1;
  31.     }
  32.   else if (l == r)
  33.     {
  34.       return 0;
  35.     }
  36.   return 1;
  37. }
  38.  
  39. void
  40. merge (int *data, int left, int right, int tid)
  41. {
  42.   if (DEBUG)
  43.     {
  44.       printf ("[%d] Merging %d to %d\n", tid, left, right);
  45.     }
  46.   int ctr = 0;
  47.   int i = left;
  48.   int mid = left + ((right - left) / 2);
  49.   int j = mid + 1;
  50.   int *c = (int *) malloc ((right - left + 1) * sizeof (int));
  51.   while (i <= mid && j <= right)
  52.     {
  53.       if (data[i] <= data[j])
  54.     {
  55.       c[ctr++] = data[i++];
  56.     }
  57.       else
  58.     {
  59.       c[ctr++] = data[j++];
  60.     }
  61.     }
  62.   if (i == mid + 1)
  63.     {
  64.       while (j <= right)
  65.     {
  66.       c[ctr++] = data[j++];
  67.     }
  68.     }
  69.   else
  70.     {
  71.       while (i <= mid)
  72.     {
  73.       c[ctr++] = data[i++];
  74.     }
  75.     }
  76.   i = left;
  77.   ctr = 0;
  78.   while (i <= right)
  79.     {
  80.       data[i++] = c[ctr++];
  81.     }
  82.   free (c);
  83.   return;
  84. }
  85.  
  86. void *
  87. merge_sort_threaded (void *arg)
  88. {
  89.   thread_data_t *data = (thread_data_t *) arg;
  90.   int l = data->left;
  91.   int r = data->right;
  92.   int t = data->tid;
  93.   if (r - l + 1 <= MIN_LENGTH)
  94.     {
  95.       if (DEBUG)
  96.     {
  97.       printf ("[%d] Calling qsort(%d, %d).\n", t, l, r);
  98.     }
  99.       qsort (data->array + l, r - l + 1, sizeof (int), my_comp);
  100.     }
  101.   else
  102.     {
  103.       int m = l + ((r - l) / 2);
  104.       thread_data_t data_0;
  105.       data_0.left = l;
  106.       data_0.right = m;
  107.       data_0.array = data->array;
  108.       pthread_mutex_lock (&lock_number_of_threads);
  109.       data_0.tid = number_of_threads++;
  110.       pthread_mutex_unlock (&lock_number_of_threads);
  111.       pthread_t thread0;
  112.                    NULL,
  113.                    merge_sort_threaded,
  114.                    &data_0);
  115.       if (rc)
  116.     {
  117.       if (DEBUG)
  118.         {
  119.               data_0.tid);
  120.         }
  121.       qsort (data->array + l, m - l + 1, sizeof (int), my_comp);
  122.     }
  123.       thread_data_t data_1;
  124.       data_1.left = m + 1;
  125.       data_1.right = r;
  126.       data_1.array = data->array;
  127.       pthread_mutex_lock (&lock_number_of_threads);
  128.       data_1.tid = number_of_threads++;
  129.       pthread_mutex_unlock (&lock_number_of_threads);
  130.       pthread_t thread1;
  131.       if (rc)
  132.     {
  133.       if (DEBUG)
  134.         {
  135.               data_1.tid);
  136.         }
  137.       qsort (data->array + m + 1, r - m, sizeof (int), my_comp);
  138.     }
  139.     {
  140.       pthread_join (thread0, NULL);
  141.     }
  142.     {
  143.       pthread_join (thread1, NULL);
  144.     }
  145.       merge (data->array, l, r, t);
  146.     }
  147.   pthread_exit (NULL);
  148.   return NULL;
  149. }
  150.  
  151. void
  152. merge_sort (int *array, int start, int finish)
  153. {
  154.   thread_data_t data;
  155.   data.array = array;
  156.   data.left = start;
  157.   data.right = finish;
  158.  
  159.   number_of_threads = 0;
  160.   pthread_mutex_init (&lock_number_of_threads, NULL);
  161.   data.tid = 0;
  162.   pthread_t thread;
  163.                NULL,
  164.                merge_sort_threaded,
  165.                &data);
  166.   if (rc)
  167.     {
  168.       if (DEBUG)
  169.     {
  170.     }
  171.       qsort (array + start, finish - start + 1, sizeof (int), my_comp);
  172.     }
  173.   pthread_join (thread, NULL);
  174.   return;
  175. }
  176.  
  177.  
  178.  
  179.  
  180. int
  181. max (int *a, int n, int i, int j, int k)
  182. {
  183.   int m = i;
  184.   if (j < n && a[j] > a[m])
  185.     {
  186.       m = j;
  187.     }
  188.   if (k < n && a[k] > a[m])
  189.     {
  190.       m = k;
  191.     }
  192.   return m;
  193. }
  194.  
  195. void
  196. downheap (int *a, int n, int i)
  197. {
  198.   while (1)
  199.     {
  200.       int j = max (a, n, i, 2 * i + 1, 2 * i + 2);
  201.       if (j == i)
  202.     {
  203.       break;
  204.     }
  205.       int t = a[i];
  206.       a[i] = a[j];
  207.       a[j] = t;
  208.       i = j;
  209.     }
  210. }
  211.  
  212. void
  213. heapsort (int *a, int n)
  214. {
  215.   int i;
  216.   for (i = (n - 2) / 2; i >= 0; i--)
  217.     {
  218.       downheap (a, n, i);
  219.     }
  220.   for (i = 0; i < n; i++)
  221.     {
  222.       int t = a[n - i - 1];
  223.       a[n - i - 1] = a[0];
  224.       a[0] = t;
  225.       downheap (a, n - i - 1, 0);
  226.     }
  227. }
  228.  
  229. void
  230. quicksort (int *A, int len)
  231. {
  232.   if (len < 2)
  233.     return;
  234.  
  235.   int pivot = A[len / 2];
  236.  
  237.   int i, j;
  238.   for (i = 0, j = len - 1;; i++, j--)
  239.     {
  240.       while (A[i] < pivot)
  241.     i++;
  242.       while (A[j] > pivot)
  243.     j--;
  244.  
  245.       if (i >= j)
  246.     break;
  247.  
  248.       int temp = A[i];
  249.       A[i] = A[j];
  250.       A[j] = temp;
  251.     }
  252.  
  253.   quicksort (A, i);
  254.   quicksort (A + i, len - i);
  255. }
  256.  
  257.  
  258.  
  259.  
  260. int
  261. main ()
  262. {
  263.  
  264.  
  265.  
  266.   printf ("Select benchmark mode");
  267.   printf ("\n(1) Multthread Mergesort (Using POPCNT)\n");
  268.   printf ("(2) Singlethread Heapsort (Using BMI)\n");
  269.   printf ("(3) Exit\n");
  270.  
  271.   int selval, mode;
  272.   scanf ("%d", &selval);
  273.   if (selval < 1 || selval > 3)
  274.     {
  275.       printf ("Invalid input.. aborting!");
  276.       return 0;
  277.     }
  278.   mode = selval;
  279.   printf ("\nSimple Heapsort benchmarking tool\n");
  280.   printf ("\nCopyright (C) 2017  Fabian Druschke (Knogle)");
  281.   printf
  282.   printf
  283.     ("\nThis is free software, and you are welcome to redistribute it \n \n \n");
  284.     if (selval == 3)
  285.     {
  286.       return 1;
  287.     }
  288.   sleep (3);
  289.   if (mode == 1)
  290.     {
  291.       int size = 100000000, loop, qrand;
  292.       int *array;
  293.       array = (int *) malloc (size * sizeof (int));
  294.       if (array != NULL)
  295.     {
  296.       if ((size * sizeof (int)) < 1000)
  297.         {
  298.           printf ("\n %lu Bytes allocated\n", (size * sizeof (int)));
  299.         }
  300.       else if ((size * sizeof (int)) >= 1000)
  301.         {
  302.           printf ("\n %lu Kilobytes allocated\n",
  303.               ((size * sizeof (int)) / 1000));
  304.         }
  305.       else if ((size * sizeof (int)) >= 1000 * 1000)
  306.         {
  307.           printf ("\n %lu Megabytes allocated\n",
  308.               ((size * sizeof (int)) / 1000 * 1000));
  309.         }
  310.       sleep (1);
  311.       printf ("\nFilling array.\n");
  312.       sleep (3);
  313.       srand ( time(NULL) );
  314.       for (loop = 0; loop < size; loop++)
  315.         {
  316.           qrand = rand () % 20;
  317.           array[loop] = qrand;
  318.           printf ("%d", qrand);
  319.         }
  320.     }
  321.       else
  322.     printf ("\nKein freier Speicher vorhanden.\n");
  323.  
  324.       printf ("\nMerge Sort..\n");
  325.       clock_t t;
  326.       t = clock ();
  327.       merge_sort (array, 0, size - 1);
  328.       for (loop = 0; loop < size; loop++)
  329.     {
  330.       printf ("%d", array[loop]);
  331.     }
  332.       if ((size * sizeof (int)) < 1000)
  333.     {
  334.       printf ("\n %lu Bytes wurden freigegeben\n", (size * sizeof (int)));
  335.     }
  336.       else if ((size * sizeof (int)) >= 1000)
  337.     {
  338.       printf ("\n %lu Kilobytes wurden freigegeben\n",
  339.           ((size * sizeof (int)) / 1000));
  340.     }
  341.       else if ((size * sizeof (int)) >= 1000 * 1000)
  342.     {
  343.       printf ("\n %lu Megabytes wurden freigegeben\n",
  344.           ((size * sizeof (int)) / 1000 * 1000));
  345.     }
  346.       t = clock () - t;
  347.       printf ("Sorting took %f seconds to finish \n", time_taken);
  348.       double score = (sizeof (int) / time_taken);
  349.       printf ("Your total score: %f", score * 1000);
  350.       printf ("\nPress ENTER to exit");
  351.       getchar ();
  352.       pthread_mutex_destroy (&lock_number_of_threads);
  353.       free (array);
  354.  
  355.     }
  356.   if (mode == 2)
  357.     {
  358.       int size = 100000000, loop, qrand;
  359.       int *array;
  360.       array = (int *) malloc (size * sizeof (int));
  361.       if (array != NULL)
  362.     {
  363.       if ((size * sizeof (int)) < 1000)
  364.         {
  365.           printf ("\n %lu Bytes allocated\n", (size * sizeof (int)));
  366.         }
  367.       else if ((size * sizeof (int)) >= 1000)
  368.         {
  369.           printf ("\n %lu Kilobytes allocated\n",
  370.               ((size * sizeof (int)) / 1000));
  371.         }
  372.       else if ((size * sizeof (int)) >= 1000 * 1000)
  373.         {
  374.           printf ("\n %lu Megabytes allocated\n",
  375.               ((size * sizeof (int)) / 1000 * 1000));
  376.         }
  377.       sleep (1);
  378.       printf ("\nFilling array.\n");
  379.       sleep (3);
  380.       srand ( time(NULL) );
  381.       for (loop = 0; loop < size; loop++)
  382.         {
  383.           qrand = rand () % 20;
  384.           array[loop] = qrand;
  385.           printf ("%d", qrand);
  386.         }
  387.     }
  388.       else
  389.     printf ("\nKein freier Speicher vorhanden.\n");
  390.       printf ("\n\n");
  391.       printf ("\nHeapsort..\n");
  392.       sleep (3);
  393.       clock_t t;
  394.       t = clock ();
  395.       heapsort (array, size);
  396.       for (loop = 0; loop < size; loop++)
  397.     {
  398.       printf ("%d", array[loop]);
  399.     }
  400.       if ((size * sizeof (int)) < 1000)
  401.     {
  402.       printf ("\n %lu Bytes reallocated\n", (size * sizeof (int)));
  403.     }
  404.       else if ((size * sizeof (int)) >= 1000)
  405.     {
  406.       printf ("\n %lu Kilobytes reallocated\n",
  407.           ((size * sizeof (int)) / 1000));
  408.     }
  409.       else if ((size * sizeof (int)) >= 1000 * 1000)
  410.     {
  411.       printf ("\n %lu Megabytes reallocated\n",
  412.           ((size * sizeof (int)) / 1000 * 1000));
  413.     }
  414.       free (array);
  415.       t = clock () - t;
  416.       printf ("Sorting took %f seconds to finish \n", time_taken);
  417.       double score = (sizeof (int) / time_taken);
  418.       printf ("Your total score: %f", score * 1000);
  419.       printf ("\nPress ENTER to exit");
  420.       getchar();
  421.     }
  422.  
  423.   return 0;
  424. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement