Ignore:
Timestamp:
Sep 1, 2020, 1:18:10 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:
86c1f1c3, a77496cb
Parents:
8d8ac3b (diff), d3aa64f (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'master' of plg.uwaterloo.ca:software/cfa/cfa-cc

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/concurrency/ready_queue.cfa

    r8d8ac3b r25a1cb0  
    215215}
    216216
     217static inline [unsigned, bool] idx_from_r(unsigned r, unsigned preferred) {
     218        unsigned i;
     219        bool local;
     220        #if defined(BIAS)
     221                unsigned rlow  = r % BIAS;
     222                unsigned rhigh = r / BIAS;
     223                if((0 != rlow) && preferred >= 0) {
     224                        // (BIAS - 1) out of BIAS chances
     225                        // Use perferred queues
     226                        i = preferred + (rhigh % 4);
     227                        local = true;
     228                }
     229                else {
     230                        // 1 out of BIAS chances
     231                        // Use all queues
     232                        i = rhigh;
     233                        local = false;
     234                }
     235        #else
     236                i = r;
     237                local = false;
     238        #endif
     239        return [i, local];
     240}
     241
    217242//-----------------------------------------------------------------------
    218243__attribute__((hot)) bool push(struct cluster * cltr, struct $thread * thrd) with (cltr->ready_queue) {
     
    222247        thrd->link.ts = rdtscl();
    223248
    224         #if defined(BIAS) && !defined(__CFA_NO_STATISTICS__)
    225                 bool local = false;
    226                 int preferred =
     249        __attribute__((unused)) bool local;
     250        __attribute__((unused)) int preferred;
     251        #if defined(BIAS)
     252                preferred =
    227253                        //*
    228254                        kernelTLS.this_processor ? kernelTLS.this_processor->id * 4 : -1;
     
    230256                        thrd->link.preferred * 4;
    231257                        //*/
    232 
    233 
    234258        #endif
    235259
     
    238262        do {
    239263                // Pick the index of a lane
    240                 #if defined(BIAS)
    241                         unsigned r = __tls_rand();
    242                         unsigned rlow  = r % BIAS;
    243                         unsigned rhigh = r / BIAS;
    244                         if((0 != rlow) && preferred >= 0) {
    245                                 // (BIAS - 1) out of BIAS chances
    246                                 // Use perferred queues
    247                                 i = preferred + (rhigh % 4);
    248 
    249                                 #if !defined(__CFA_NO_STATISTICS__)
    250                                         local = true;
    251                                         __tls_stats()->ready.pick.push.local++;
    252                                 #endif
    253                         }
    254                         else {
    255                                 // 1 out of BIAS chances
    256                                 // Use all queues
    257                                 i = rhigh;
    258                                 local = false;
    259                         }
    260                 #else
    261                         i = __tls_rand();
     264                // unsigned r = __tls_rand();
     265                unsigned r = __tls_rand_fwd();
     266                [i, local] = idx_from_r(r, preferred);
     267
     268                #if !defined(__CFA_NO_STATISTICS__)
     269                        if(local) {
     270                                __tls_stats()->ready.pick.push.local++;
     271                        }
    262272                #endif
    263273
     
    274284
    275285        // Actually push it
    276         bool lane_first = push(lanes.data[i], thrd);
     286        #ifdef USE_SNZI
     287                bool lane_first =
     288        #endif
     289
     290        push(lanes.data[i], thrd);
    277291
    278292        #ifdef USE_SNZI
     
    287301        #endif
    288302
     303        __tls_rand_advance_bck();
     304
    289305        // Unlock and return
    290306        __atomic_unlock( &lanes.data[i].lock );
     
    311327        /* paranoid */ verify( lanes.count > 0 );
    312328        unsigned count = __atomic_load_n( &lanes.count, __ATOMIC_RELAXED );
     329        int preferred;
    313330        #if defined(BIAS)
    314331                // Don't bother trying locally too much
    315332                int local_tries = 8;
    316         #endif
     333                preferred = kernelTLS.this_processor->id * 4;
     334        #endif
     335
    317336
    318337        // As long as the list is not empty, try finding a lane that isn't empty and pop from it
     
    323342        #endif
    324343                // Pick two lists at random
    325                 unsigned i,j;
    326                 #if defined(BIAS)
    327                         #if !defined(__CFA_NO_STATISTICS__)
    328                                 bool local = false;
    329                         #endif
    330                         uint64_t r = __tls_rand();
    331                         unsigned rlow  = r % BIAS;
    332                         uint64_t rhigh = r / BIAS;
    333                         if(local_tries && 0 != rlow) {
    334                                 // (BIAS - 1) out of BIAS chances
    335                                 // Use perferred queues
    336                                 unsigned pid = kernelTLS.this_processor->id * 4;
    337                                 i = pid + (rhigh % 4);
    338                                 j = pid + ((rhigh >> 32ull) % 4);
    339 
    340                                 // count the tries
    341                                 local_tries--;
    342 
    343                                 #if !defined(__CFA_NO_STATISTICS__)
    344                                         local = true;
    345                                         __tls_stats()->ready.pick.pop.local++;
    346                                 #endif
    347                         }
    348                         else {
    349                                 // 1 out of BIAS chances
    350                                 // Use all queues
    351                                 i = rhigh;
    352                                 j = rhigh >> 32ull;
    353                         }
    354                 #else
    355                         i = __tls_rand();
    356                         j = __tls_rand();
     344                // unsigned ri = __tls_rand();
     345                // unsigned rj = __tls_rand();
     346                unsigned ri = __tls_rand_bck();
     347                unsigned rj = __tls_rand_bck();
     348
     349                unsigned i, j;
     350                __attribute__((unused)) bool locali, localj;
     351                [i, locali] = idx_from_r(ri, preferred);
     352                [j, localj] = idx_from_r(rj, preferred);
     353
     354                #if !defined(__CFA_NO_STATISTICS__)
     355                        if(locali) {
     356                                __tls_stats()->ready.pick.pop.local++;
     357                        }
     358                        if(localj) {
     359                                __tls_stats()->ready.pick.pop.local++;
     360                        }
    357361                #endif
    358362
     
    364368                if(thrd) {
    365369                        #if defined(BIAS) && !defined(__CFA_NO_STATISTICS__)
    366                                 if( local ) __tls_stats()->ready.pick.pop.lsuccess++;
     370                                if( locali || localj ) __tls_stats()->ready.pick.pop.lsuccess++;
    367371                        #endif
    368372                        return thrd;
     
    543547
    544548                // Allocate new array (uses realloc and memcpies the data)
    545                 lanes.data = alloc(lanes.data, ncount);
     549                lanes.data = alloc( ncount, lanes.data`realloc );
    546550
    547551                // Fix the moved data
     
    634638
    635639                // Allocate new array (uses realloc and memcpies the data)
    636                 lanes.data = alloc(lanes.data, lanes.count);
     640                lanes.data = alloc( lanes.count, lanes.data`realloc );
    637641
    638642                // Fix the moved data
Note: See TracChangeset for help on using the changeset viewer.