Advertisement
avp210159

thsum.c sum vector in threads

May 13th, 2016
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.20 KB | None | 0 0
  1. // avp 2016 for http://ru.stackoverflow.com/questions/521709/%D0%9A%D0%B0%D0%BA-%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE-%D1%83%D1%81%D0%BA%D0%BE%D1%80%D0%B8%D1%82%D1%8C-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8E-%D0%9F%D0%BE%D1%87%D0%B5%D0%BC%D1%83-%D1%82%D0%BE-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D1%82-%D1%82%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE-%D0%BE%D0%B4%D0%BD%D0%BE-%D1%8F%D0%B4%D1%80%D0%BE
  2.  
  3. // gcc thsum.c -pthread -O3
  4. // ./a.out [N-threads]
  5.  
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <pthread.h>
  9.  
  10. int sum (int *v, int s, int e) {
  11.   int su = 0;
  12.  
  13.   for (; s < e; s++)
  14.     su += v[s];
  15.  
  16.   return su;
  17. }
  18.  
  19. struct req {
  20.   int *v, s, e;
  21. };
  22.  
  23. void *
  24. call_sum (void *a)
  25. {
  26.   struct req *r = (__typeof__(r))a;
  27.   int s = sum(r->v, r->s, r->e);
  28.   free(a);
  29.   return (void *)(long)s;
  30. }
  31.  
  32.  
  33. int handle (int *v, int sz, void * f(void *), int n)
  34. {
  35.   pthread_t th[n];
  36.   int answers[n];
  37.   int mid = sz / n,
  38.     i, start = 0, end = start + mid;
  39.  
  40.   for (i = 0; i < n; i++) {
  41.     start = mid * i;
  42.     end = start + mid;
  43.     if (end != sz && sz - end < mid)
  44.       end = sz;
  45.     struct req  *req = malloc(sizeof(*req));
  46.     req->v = v; req->s = start; req->e = end;
  47.     pthread_create(th + i, 0, f, req);
  48.   }
  49.   for (i = 0; i < n; i++) {
  50.     void *r;
  51.     pthread_join(th[i], &r);
  52.     answers[i] = (long)r;
  53.   }
  54.  
  55.   return sum(answers, 0, n);
  56. }
  57.  
  58. void print (const char *nm, int s, clock_t t, int n)
  59. {
  60.   printf("%s: %d %ld clocks (%g msec)  (%d threads)\n",
  61.      nm, s, (long)t, ((double)t / CLOCKS_PER_SEC) * 1000, n);
  62. }
  63.  
  64. int main (int ac, char *av[])
  65. {
  66.   int N = 1000021, i;
  67.   int *v = malloc(sizeof(int) * N);
  68.   for (i = 0; i < N; i++)
  69.     v[i] = random() % 10;
  70.   int s1, s2, nt = atoi(av[1] ? : "2"),
  71.     l = 10000; // number of outer iterations
  72.   long long ls = 0;
  73.  
  74.   if (nt < 2)
  75.     nt = 2;
  76.   clock_t start, t1, t2;
  77.   start = clock();
  78.   for (int i = 0; i < l; i++)
  79.     s2 = handle(v, N, call_sum, nt), ls += s2;
  80.   t2 = clock() - start;
  81.   start = clock();
  82.   puts("one thread test\n");
  83.   for (int i = 0; i < l; i++)
  84.     s1 = sum(v, 0, N), ls += s1;
  85.   t1 = clock() - start;
  86.  
  87.   print("s1", s1, t1, 1);
  88.   print("s2", s2, t2, nt);
  89.   printf("ls = %lld\n", ls);
  90.  
  91.   return puts("End") == EOF;
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement