source: benchmark/readyQ/cycle.cpp @ a633f6f

ADTast-experimentalenumforall-pointer-decaypthread-emulationqualifiedEnum
Last change on this file since a633f6f was ebb6158, checked in by Thierry Delisle <tdelisle@…>, 3 years ago

Minor fixes to warnings, printing and ridiculous go/rust requirements.

  • Property mode set to 100644
File size: 2.6 KB
Line 
1
2#include "rq_bench.hpp"
3#include <libfibre/fibre.h>
4
5struct Partner {
6        unsigned long long count  = 0;
7        unsigned long long blocks = 0;
8        bench_sem self;
9        bench_sem * next;
10};
11
12void partner_main( Partner * self ) {
13        self->count = 0;
14        for(;;) {
15                self->blocks += self->self.wait();
16                self->next->post();
17                self->count ++;
18                if( clock_mode && stop) break;
19                if(!clock_mode && self->count >= stop_count) break;
20        }
21
22        __atomic_fetch_add(&threads_left, -1, __ATOMIC_SEQ_CST);
23}
24
25int main(int argc, char * argv[]) {
26        unsigned ring_size = 2;
27        option_t opt[] = {
28                BENCH_OPT,
29                { 'r', "ringsize", "Number of threads in a cycle", ring_size }
30        };
31        BENCH_OPT_PARSE("libfibre cycle benchmark");
32
33        {
34                unsigned long long global_counter = 0;
35                unsigned long long global_blocks  = 0;
36                unsigned tthreads = nthreads * ring_size;
37                uint64_t start, end;
38                FibreInit(1, nprocs);
39                {
40                        threads_left = tthreads;
41                        Fibre * threads[tthreads];
42                        Partner thddata[tthreads];
43                        for(unsigned i = 0; i < tthreads; i++) {
44                                unsigned pi = (i + nthreads) % tthreads;
45                                thddata[i].next = &thddata[pi].self;
46                        }
47                        for(unsigned i = 0; i < tthreads; i++) {
48                                threads[i] = new Fibre( reinterpret_cast<void (*)(void *)>(partner_main), &thddata[i] );
49                        }
50                        printf("Starting\n");
51
52                        bool is_tty = isatty(STDOUT_FILENO);
53                        start = timeHiRes();
54
55                        for(unsigned i = 0; i < nthreads; i++) {
56                                thddata[i].self.post();
57                        }
58                        wait<Fibre>(start, is_tty);
59
60                        stop = true;
61                        end = timeHiRes();
62                        printf("\nDone\n");
63
64                        for(unsigned i = 0; i < tthreads; i++) {
65                                thddata[i].self.post();
66                                fibre_join( threads[i], nullptr );
67                                global_counter += thddata[i].count;
68                                global_blocks  += thddata[i].blocks;
69                        }
70                }
71
72                printf("Duration (ms)        : %'ld\n", to_miliseconds(end - start));
73                printf("Number of processors : %'d\n", nprocs);
74                printf("Number of threads    : %'d\n", tthreads);
75                printf("Cycle size (# thrds) : %'d\n", ring_size);
76                printf("Total Operations(ops): %'15llu\n", global_counter);
77                printf("Total blocks         : %'15llu\n", global_blocks);
78                printf("Ops per second       : %'18.2lf\n", ((double)global_counter) / to_fseconds(end - start));
79                printf("ns per ops           : %'18.2lf\n", ((double)(end - start)) / global_counter);
80                printf("Ops per threads      : %'15llu\n", global_counter / tthreads);
81                printf("Ops per procs        : %'15llu\n", global_counter / nprocs);
82                printf("Ops/sec/procs        : %'18.2lf\n", (((double)global_counter) / nprocs) / to_fseconds(end - start));
83                printf("ns per ops/procs     : %'18.2lf\n", ((double)(end - start)) / (global_counter / nprocs));
84                fflush(stdout);
85        }
86
87        return 0;
88}
Note: See TracBrowser for help on using the repository browser.