Changes in / [92b9958:a0e7d3c]


Ignore:
Location:
libcfa/src/concurrency
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/concurrency/kernel.hfa

    r92b9958 ra0e7d3c  
    145145void ^?{}(__intrusive_lane_t & this);
    146146
    147 // Counter used for wether or not the lanes are all empty
    148 struct __attribute__((aligned(128))) __snzi_node_t;
    149 struct __snzi_t {
    150         unsigned mask;
    151         int root;
    152         __snzi_node_t * nodes;
    153 };
    154 
    155 void  ?{}( __snzi_t & this, unsigned depth );
    156 void ^?{}( __snzi_t & this );
    157 
    158147//TODO adjust cache size to ARCHITECTURE
    159148// Structure holding the relaxed ready queue
    160149struct __ready_queue_t {
    161         // Data tracking how many/which lanes are used
    162         // Aligned to 128 for cache locality
    163         __snzi_t snzi;
    164 
    165150        // Data tracking the actual lanes
    166151        // On a seperate cacheline from the used struct since
  • libcfa/src/concurrency/kernel_private.hfa

    r92b9958 ra0e7d3c  
    284284// Ready-Queue API
    285285//-----------------------------------------------------------------------
    286 // pop thread from the ready queue of a cluster
    287 // returns 0p if empty
    288 __attribute__((hot)) bool query(struct cluster * cltr);
    289 
    290 //-----------------------------------------------------------------------
    291286// push thread onto a ready queue for a cluster
    292287// returns true if the list was previously empty, false otherwise
  • libcfa/src/concurrency/ready_queue.cfa

    r92b9958 ra0e7d3c  
    1717// #define __CFA_DEBUG_PRINT_READY_QUEUE__
    1818
    19 // #define USE_SNZI
    2019// #define USE_MPSC
    2120
     
    2928#include <unistd.h>
    3029
    31 #include "snzi.hfa"
    3230#include "ready_subqueue.hfa"
    3331
     
    202200void ^?{}(__ready_queue_t & this) with (this) {
    203201        verify( 1 == lanes.count );
    204         #ifdef USE_SNZI
    205                 verify( !query( snzi ) );
    206         #endif
    207202        free(lanes.data);
    208203}
    209204
    210205//-----------------------------------------------------------------------
    211 __attribute__((hot)) bool query(struct cluster * cltr) {
    212         #ifdef USE_SNZI
    213                 return query(cltr->ready_queue.snzi);
    214         #endif
    215         return true;
    216 }
    217 
    218206static inline [unsigned, bool] idx_from_r(unsigned r, unsigned preferred) {
    219207        unsigned i;
     
    293281
    294282        // Actually push it
    295         #ifdef USE_SNZI
    296                 bool lane_first =
    297         #endif
    298 
    299283        push(lanes.data[i], thrd);
    300 
    301         #ifdef USE_SNZI
    302                 // If this lane used to be empty we need to do more
    303                 if(lane_first) {
    304                         // Check if the entire queue used to be empty
    305                         first = !query(snzi);
    306 
    307                         // Update the snzi
    308                         arrive( snzi, i );
    309                 }
    310         #endif
    311284
    312285        #if !defined(USE_MPSC)
     
    351324
    352325        // As long as the list is not empty, try finding a lane that isn't empty and pop from it
    353         #ifdef USE_SNZI
    354                 while( query(snzi) ) {
    355         #else
    356                 for(25) {
    357         #endif
     326        for(25) {
    358327                // Pick two lists at random
    359328                // unsigned ri = __tls_rand();
     
    447416        /* paranoid */ verify(lane.lock);
    448417
    449         #ifdef USE_SNZI
    450                 // If this was the last element in the lane
    451                 if(emptied) {
    452                         depart( snzi, w );
    453                 }
    454         #endif
    455 
    456418        // Unlock and return
    457419        __atomic_unlock(&lane.lock);
     
    484446
    485447                                removed = true;
    486                                 #ifdef USE_SNZI
    487                                         if(emptied) {
    488                                                 depart( snzi, i );
    489                                         }
    490                                 #endif
    491448                        }
    492449                __atomic_unlock(&lane.lock);
     
    571528        // grow the ready queue
    572529        with( cltr->ready_queue ) {
    573                 #ifdef USE_SNZI
    574                         ^(snzi){};
    575                 #endif
    576 
    577530                // Find new count
    578531                // Make sure we always have atleast 1 list
     
    598551                // Update original
    599552                lanes.count = ncount;
    600 
    601                 #ifdef USE_SNZI
    602                         // Re-create the snzi
    603                         snzi{ log2( lanes.count / 8 ) };
    604                         for( idx; (size_t)lanes.count ) {
    605                                 if( !is_empty(lanes.data[idx]) ) {
    606                                         arrive(snzi, idx);
    607                                 }
    608                         }
    609                 #endif
    610553        }
    611554
     
    631574
    632575        with( cltr->ready_queue ) {
    633                 #ifdef USE_SNZI
    634                         ^(snzi){};
    635                 #endif
    636 
    637576                // Remember old count
    638577                size_t ocount = lanes.count;
     
    685624                        fix(lanes.data[idx]);
    686625                }
    687 
    688                 #ifdef USE_SNZI
    689                         // Re-create the snzi
    690                         snzi{ log2( lanes.count / 8 ) };
    691                         for( idx; (size_t)lanes.count ) {
    692                                 if( !is_empty(lanes.data[idx]) ) {
    693                                         arrive(snzi, idx);
    694                                 }
    695                         }
    696                 #endif
    697626        }
    698627
Note: See TracChangeset for help on using the changeset viewer.