Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // 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
- // gcc thsum.c -pthread -O3
- // ./a.out [N-threads]
- #include <stdio.h>
- #include <stdlib.h>
- #include <pthread.h>
- int sum (int *v, int s, int e) {
- int su = 0;
- for (; s < e; s++)
- su += v[s];
- return su;
- }
- struct req {
- int *v, s, e;
- };
- void *
- call_sum (void *a)
- {
- struct req *r = (__typeof__(r))a;
- int s = sum(r->v, r->s, r->e);
- free(a);
- return (void *)(long)s;
- }
- int handle (int *v, int sz, void * f(void *), int n)
- {
- pthread_t th[n];
- int answers[n];
- int mid = sz / n,
- i, start = 0, end = start + mid;
- for (i = 0; i < n; i++) {
- start = mid * i;
- end = start + mid;
- if (end != sz && sz - end < mid)
- end = sz;
- struct req *req = malloc(sizeof(*req));
- req->v = v; req->s = start; req->e = end;
- pthread_create(th + i, 0, f, req);
- }
- for (i = 0; i < n; i++) {
- void *r;
- pthread_join(th[i], &r);
- answers[i] = (long)r;
- }
- return sum(answers, 0, n);
- }
- void print (const char *nm, int s, clock_t t, int n)
- {
- printf("%s: %d %ld clocks (%g msec) (%d threads)\n",
- nm, s, (long)t, ((double)t / CLOCKS_PER_SEC) * 1000, n);
- }
- int main (int ac, char *av[])
- {
- int N = 1000021, i;
- int *v = malloc(sizeof(int) * N);
- for (i = 0; i < N; i++)
- v[i] = random() % 10;
- int s1, s2, nt = atoi(av[1] ? : "2"),
- l = 10000; // number of outer iterations
- long long ls = 0;
- if (nt < 2)
- nt = 2;
- clock_t start, t1, t2;
- start = clock();
- for (int i = 0; i < l; i++)
- s2 = handle(v, N, call_sum, nt), ls += s2;
- t2 = clock() - start;
- start = clock();
- puts("one thread test\n");
- for (int i = 0; i < l; i++)
- s1 = sum(v, 0, N), ls += s1;
- t1 = clock() - start;
- print("s1", s1, t1, 1);
- print("s2", s2, t2, nt);
- printf("ls = %lld\n", ls);
- return puts("End") == EOF;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement