Changeset 8e1b1bb


Ignore:
Timestamp:
May 26, 2020, 11:43:13 AM (4 years ago)
Author:
Thierry Delisle <tdelisle@…>
Branches:
ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum
Children:
0092853
Parents:
3bf812b
Message:

Now using a single macro for algorithmic variants

Location:
doc/theses/thierry_delisle_PhD/code
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • doc/theses/thierry_delisle_PhD/code/relaxed_list.cpp

    r3bf812b r8e1b1bb  
    918918
    919919        std::cout << "Running " << nthreads << " threads (" << (nthreads * nqueues) << " queues) for " << duration << " seconds" << std::endl;
     920        std::cout << "Relaxed list variant: " << relaxed_list<Node>::name() << std::endl;
    920921        switch(benchmark) {
    921922                case Churn:
  • doc/theses/thierry_delisle_PhD/code/relaxed_list.hpp

    r3bf812b r8e1b1bb  
    11#pragma once
     2
     3enum VARIANTS {
     4        VANILLA,
     5        SNZI,
     6        BITMASK,
     7        DISCOVER
     8};
     9
     10#ifndef VARIANT
     11#define VARIANT VANILLA
     12#endif
    213
    314#ifndef NO_STATS
     
    1324#include "utils.hpp"
    1425#include "snzi.hpp"
     26
     27#define MACRO_XSTR(s) MACRO_STR(s)
     28#define MACRO_STR(s) #s
    1529
    1630using namespace std;
     
    5468
    5569public:
     70        static const char * name() {
     71                return MACRO_XSTR(VARIANT);
     72        }
     73
    5674        relaxed_list(unsigned numLists)
    5775                : lists(new intrusive_queue_t[numLists])
    5876                , numLists(numLists)
    59                 #if defined(SIMPLE_SNZI) || defined(DISCOVER_BITMASK)
     77                #if VARIANT == SNZI || VARIANT == DISCOVER
    6078                        , snzi( std::log2( numLists / 8 ) )
    6179                #endif
     
    90108                        if( !lists[i].lock.try_lock() ) continue;
    91109
    92                         #if !defined(SIMPLE_SNZI) && !defined(DISCOVER_BITMASK)
     110                        #if VARIANT != SNZI && VARIANT != DISCOVER
    93111                                __attribute__((unused)) int num = numNonEmpty;
    94112                        #endif
     
    96114                        // Actually push it
    97115                        if(lists[i].push(node)) {
    98                                 #if defined(DISCOVER_BITMASK)
     116                                #if VARIANT == DISCOVER
    99117                                        size_t qword = i >> 6ull;
    100118                                        size_t bit   = i & 63ull;
     
    102120                                        bts(tls.mask, bit);
    103121                                        snzi.arrive(i);
    104                                 #elif defined(SIMPLE_SNZI)
     122                                #elif VARIANT == SNZI
    105123                                        snzi.arrive(i);
    106                                 #elif !defined(NO_BITMASK)
     124                                #elif VARIANT == BITMASK
    107125                                        numNonEmpty++;
    108126                                        size_t qword = i >> 6ull;
     
    116134                                #endif
    117135                        }
    118                         #if !defined(SIMPLE_SNZI) && !defined(DISCOVER_BITMASK)
     136                        #if VARIANT != SNZI && VARIANT != DISCOVER
    119137                                assert(numNonEmpty <= (int)numLists);
    120138                        #endif
     
    125143                        #ifndef NO_STATS
    126144                                tls.pick.push.success++;
    127                                 #if !defined(SIMPLE_SNZI) && !defined(DISCOVER_BITMASK)
     145                                #if VARIANT != SNZI && VARIANT != DISCOVER
    128146                                        tls.empty.push.value += num;
    129147                                        tls.empty.push.count += 1;
     
    135153
    136154        __attribute__((noinline, hot)) node_t * pop() {
    137                 #if defined(DISCOVER_BITMASK)
     155                #if VARIANT == DISCOVER
    138156                        assert(numLists <= 64);
    139157                        while(snzi.query()) {
     
    164182                                if(auto node = try_pop(i, j)) return node;
    165183                        }
    166                 #elif defined(SIMPLE_SNZI)
     184                #elif VARIANT == SNZI
    167185                        while(snzi.query()) {
    168186                                // Pick two lists at random
     
    172190                                if(auto node = try_pop(i, j)) return node;
    173191                        }
    174                 #elif !defined(NO_BITMASK)
     192                #elif VARIANT == BITMASK
    175193                        int nnempty;
    176194                        while(0 != (nnempty = numNonEmpty)) {
     
    226244                #endif
    227245
    228                 #if defined(DISCOVER_BITMASK)
     246                #if VARIANT == DISCOVER
    229247                        if(lists[i].ts() > 0) bts(tls.mask, i); else btr(tls.mask, i);
    230248                        if(lists[j].ts() > 0) bts(tls.mask, j); else btr(tls.mask, j);
     
    244262                if( !list.lock.try_lock() ) return nullptr;
    245263
    246                 #if !defined(SIMPLE_SNZI) && !defined(DISCOVER_BITMASK)
     264                #if VARIANT != SNZI && VARIANT != DISCOVER
    247265                        __attribute__((unused)) int num = numNonEmpty;
    248266                #endif
     
    261279
    262280                if(emptied) {
    263                         #if defined(DISCOVER_BITMASK)
     281                        #if VARIANT == DISCOVER
    264282                                size_t qword = w >> 6ull;
    265283                                size_t bit   = w & 63ull;
     
    267285                                __attribute__((unused)) bool ret = btr(tls.mask, bit);
    268286                                snzi.depart(w);
    269                         #elif defined(SIMPLE_SNZI)
     287                        #elif VARIANT == SNZI
    270288                                snzi.depart(w);
    271                         #elif !defined(NO_BITMASK)
     289                        #elif VARIANT == BITMASK
    272290                                numNonEmpty--;
    273291                                size_t qword = w >> 6ull;
     
    284302                // Unlock and return
    285303                list.lock.unlock();
    286                 #if !defined(SIMPLE_SNZI) && !defined(DISCOVER_BITMASK)
     304                #if VARIANT != SNZI && VARIANT != DISCOVER
    287305                        assert(numNonEmpty >= 0);
    288306                #endif
    289307                #ifndef NO_STATS
    290308                        tls.pick.pop.success++;
    291                         #if !defined(SIMPLE_SNZI) && !defined(DISCOVER_BITMASK)
     309                        #if VARIANT != SNZI && VARIANT != DISCOVER
    292310                                tls.empty.pop.value += num;
    293311                                tls.empty.pop.count += 1;
     
    435453        const unsigned numLists;
    436454private:
    437         #if defined(SIMPLE_SNZI) || defined(DISCOVER_BITMASK)
     455        #if VARIANT == SNZI || VARIANT == DISCOVER
    438456                snzi_t snzi;
    439457        #else
    440458                std::atomic_int numNonEmpty  = { 0 };  // number of non-empty lists
     459        #endif
     460        #if VARIANT == BITMASK
    441461                std::atomic_size_t list_mask[7] = { {0}, {0}, {0}, {0}, {0}, {0}, {0} }; // which queues are empty
    442462        #endif
Note: See TracChangeset for help on using the changeset viewer.