Ignore:
Timestamp:
Nov 3, 2020, 1:21:36 PM (4 years ago)
Author:
Thierry Delisle <tdelisle@…>
Branches:
ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
Children:
dbb1073
Parents:
58688bf
Message:

Fixed cycle benchmark to avoid extra unmatched unpark.
Added libfibre implementation.
Split out go common code into bench.go

File:
1 edited

Legend:

Unmodified
Added
Removed
  • benchmark/readyQ/cycle.cfa

    r58688bf r2c7eee0  
    11#include "rq_bench.hfa"
    22
    3 thread Partner {
    4         Partner * partner;
     3struct Partner {
    54        unsigned long long count;
     5        unsigned long long blocks;
     6        bench_sem self;
     7        bench_sem * next;
    68};
    79
    810void ?{}( Partner & this ) {
    9         ((thread&)this){ bench_cluster };
     11        this.count = this.blocks = 0;
    1012}
    1113
    12 void main( Partner & this ) {
    13         this.count = 0;
     14thread BThrd {
     15        Partner & partner;
     16};
     17
     18void ?{}( BThrd & this, Partner * partner ) {
     19        ((thread&)this){ bench_cluster };
     20        &this.partner = partner;
     21}
     22
     23void ^?{}( BThrd & mutex this ) {}
     24
     25void main( BThrd & thrd ) with(thrd.partner) {
     26        count = 0;
    1427        for() {
    15                 park();
    16                 unpark( *this.partner );
    17                 this.count ++;
     28                blocks += wait( self );
     29                post( *next );
     30                count ++;
    1831                if( clock_mode && stop) break;
    19                 if(!clock_mode && this.count >= stop_count) break;
     32                if(!clock_mode && count >= stop_count) break;
    2033        }
    2134
     
    3346        {
    3447                unsigned long long global_counter = 0;
     48                unsigned long long global_blocks  = 0;
    3549                unsigned tthreads = nthreads * ring_size;
    3650                Time start, end;
     
    3852                {
    3953                        threads_left = tthreads;
    40                         Partner threads[tthreads];
     54                        BThrd * threads[tthreads];
     55                        Partner thddata[tthreads];
    4156                        for(i; tthreads) {
    4257                                unsigned pi = (i + nthreads) % tthreads;
    43                                 threads[i].partner = &threads[pi];
     58                                thddata[i].next = &thddata[pi].self;
     59                        }
     60                        for(int i = 0; i < tthreads; i++) {
     61                                threads[i] = malloc();
     62                                (*threads[i]){ &thddata[i] };
    4463                        }
    4564                        printf("Starting\n");
     
    4968
    5069                        for(i; nthreads) {
    51                                 unpark( threads[i] );
     70                                post( thddata[i].self );
    5271                        }
    5372                        wait(start, is_tty);
     
    5877
    5978                        for(i; tthreads) {
    60                                 global_counter += join( threads[i] ).count;
     79                                Partner & partner = join( *threads[i] ).partner;
     80                                global_counter += partner.count;
     81                                global_blocks  += partner.blocks;
     82                                delete(threads[i]);
    6183                        }
    6284                }
    6385
    64                 printf("Duration (ms)       : %'ld\n", (end - start)`ms);
    65                 printf("Number of processors: %'d\n", nprocs);
    66                 printf("Number of threads   : %'d\n", tthreads);
    67                 printf("Cycle size (# thrds): %'d\n", ring_size);
    68                 printf("Yields per second   : %'18.2lf\n", ((double)global_counter) / (end - start)`s);
    69                 printf("ns per yields       : %'18.2lf\n", ((double)(end - start)`ns) / global_counter);
    70                 printf("Total yields        : %'15llu\n", global_counter);
    71                 printf("Yields per threads  : %'15llu\n", global_counter / tthreads);
    72                 printf("Yields per procs    : %'15llu\n", global_counter / nprocs);
    73                 printf("Yields/sec/procs    : %'18.2lf\n", (((double)global_counter) / nprocs) / (end - start)`s);
    74                 printf("ns per yields/procs : %'18.2lf\n", ((double)(end - start)`ns) / (global_counter / nprocs));
     86                printf("Duration (ms)        : %'ld\n", (end - start)`ms);
     87                printf("Number of processors : %'d\n", nprocs);
     88                printf("Number of threads    : %'d\n", tthreads);
     89                printf("Cycle size (# thrds) : %'d\n", ring_size);
     90                printf("Total Operations(ops): %'15llu\n", global_counter);
     91                printf("Total blocks         : %'15llu\n", global_blocks);
     92                printf("Ops per second       : %'18.2lf\n", ((double)global_counter) / (end - start)`s);
     93                printf("ns per ops           : %'18.2lf\n", ((double)(end - start)`ns) / global_counter);
     94                printf("Ops per threads      : %'15llu\n", global_counter / tthreads);
     95                printf("Ops per procs        : %'15llu\n", global_counter / nprocs);
     96                printf("Ops/sec/procs        : %'18.2lf\n", (((double)global_counter) / nprocs) / (end - start)`s);
     97                printf("ns per ops/procs     : %'18.2lf\n", ((double)(end - start)`ns) / (global_counter / nprocs));
    7598                fflush(stdout);
    7699        }
Note: See TracChangeset for help on using the changeset viewer.