Changeset 69d1748 for benchmark/readyQ


Ignore:
Timestamp:
Nov 18, 2020, 4:34:08 PM (3 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:
7c9ac4a
Parents:
3ea8ad1
Message:

Some fixes to cycle benchmark and added a pthread version

Location:
benchmark/readyQ
Files:
1 added
3 edited

Legend:

Unmodified
Added
Removed
  • benchmark/readyQ/cycle.cfa

    r3ea8ad1 r69d1748  
    7777
    7878                        for(i; tthreads) {
     79                                post( thddata[i].self );
    7980                                Partner & partner = join( *threads[i] ).partner;
    8081                                global_counter += partner.count;
  • benchmark/readyQ/cycle.cpp

    r3ea8ad1 r69d1748  
    11
    22#include "rq_bench.hpp"
     3#include <libfibre/fibre.h>
    34
     5class __attribute__((aligned(128))) bench_sem {
     6        Fibre * volatile ptr = nullptr;
     7public:
     8        inline bool wait() {
     9                static Fibre * const ready  = reinterpret_cast<Fibre * const>(1ull);
     10                for(;;) {
     11                        Fibre * expected = this->ptr;
     12                        if(expected == ready) {
     13                                if(__atomic_compare_exchange_n(&this->ptr, &expected, nullptr, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) {
     14                                        return false;
     15                                }
     16                        }
     17                        else {
     18                                /* paranoid */ assert( expected == nullptr );
     19                                if(__atomic_compare_exchange_n(&this->ptr, &expected, fibre_self(), false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) {
     20                                        fibre_park();
     21                                        return true;
     22                                }
     23                        }
     24
     25                }
     26        }
     27
     28        inline bool post() {
     29                static Fibre * const ready  = reinterpret_cast<Fibre * const>(1ull);
     30                for(;;) {
     31                        Fibre * expected = this->ptr;
     32                        if(expected == ready) return false;
     33                        if(expected == nullptr) {
     34                                if(__atomic_compare_exchange_n(&this->ptr, &expected, ready, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) {
     35                                        return false;
     36                                }
     37                        }
     38                        else {
     39                                if(__atomic_compare_exchange_n(&this->ptr, &expected, nullptr, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) {
     40                                        fibre_unpark( expected );
     41                                        return true;
     42                                }
     43                        }
     44                }
     45        }
     46};
    447struct Partner {
    548        unsigned long long count  = 0;
     
    5598                                thddata[i].self.post();
    5699                        }
    57                         wait(start, is_tty);
     100                        wait<Fibre>(start, is_tty);
    58101
    59102                        stop = true;
     
    62105
    63106                        for(int i = 0; i < tthreads; i++) {
     107                                thddata[i].self.post();
    64108                                fibre_join( threads[i], nullptr );
    65109                                global_counter += thddata[i].count;
  • benchmark/readyQ/cycle.go

    r3ea8ad1 r69d1748  
    6363        global_counter := uint64(0)
    6464        for i := 0; i < tthreads; i++ {
     65                select {
     66                case channels[i] <- 0:
     67                default:
     68                }
    6569                global_counter += <- result
    6670        }
Note: See TracChangeset for help on using the changeset viewer.