Ignore:
Timestamp:
Apr 19, 2022, 3:00:04 PM (3 years ago)
Author:
m3zulfiq <m3zulfiq@…>
Branches:
ADT, ast-experimental, master, pthread-emulation, qualifiedEnum
Children:
5b84a321
Parents:
ba897d21 (diff), bb7c77d (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:

added benchmark and evaluations chapter to thesis

File:
1 edited

Legend:

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

    rba897d21 r2e9b59b  
    4848extern struct cluster * mainCluster;
    4949
    50 // Processor id, required for scheduling threads
    51 
    52 
     50// Coroutine used py processors for the 2-step context switch
    5351coroutine processorCtx_t {
    5452        struct processor * proc;
    5553};
    5654
    57 
     55struct io_future_t;
     56
     57// Information needed for idle sleep
    5858struct __fd_waitctx {
    59         volatile int fd;
     59        // semaphore/future like object
     60        // values can be 0, 1 or some file descriptor.
     61        // 0 - is the default state
     62        // 1 - means the proc should wake-up immediately
     63        // FD - means the proc is going asleep and should be woken by writing to the FD.
     64        volatile int sem;
     65
     66        // The event FD that corresponds to this processor
     67        int evfd;
     68
     69        // buffer into which the proc will read from evfd
     70        // unused if not using io_uring for idle sleep
     71        void * rdbuf;
     72
     73        // future use to track the read of the eventfd
     74        // unused if not using io_uring for idle sleep
     75        io_future_t * ftr;
     76
     77        volatile unsigned long long wake__time;
     78        volatile unsigned long long sleep_time;
     79        volatile unsigned long long drain_time;
    6080};
    6181
     
    92112        struct {
    93113                $io_context * ctx;
    94                 bool pending;
    95                 bool dirty;
     114                unsigned target;
     115                volatile bool pending;
     116                volatile bool dirty;
    96117        } io;
    97118
     
    103124        bool pending_preemption;
    104125
    105         // Idle lock (kernel semaphore)
    106         int idle_fd;
    107 
    108         // Idle waitctx
     126        // context for idle sleep
    109127        struct __fd_waitctx idle_wctx;
    110128
     
    155173void ^?{}(__intrusive_lane_t & this);
    156174
    157 // Aligned timestamps which are used by the relaxed ready queue
     175// Aligned timestamps which are used by the ready queue and io subsystem
    158176struct __attribute__((aligned(128))) __timestamp_t {
    159177        volatile unsigned long long tv;
     
    161179};
    162180
     181static inline void  ?{}(__timestamp_t & this) { this.tv = 0; this.ma = 0; }
     182static inline void ^?{}(__timestamp_t &) {}
     183
     184
    163185struct __attribute__((aligned(16))) __cache_id_t {
    164186        volatile unsigned id;
    165187};
    166 
    167 // Aligned timestamps which are used by the relaxed ready queue
    168 struct __attribute__((aligned(128))) __help_cnts_t {
    169         volatile unsigned long long src;
    170         volatile unsigned long long dst;
    171         volatile unsigned long long tri;
    172 };
    173 
    174 static inline void  ?{}(__timestamp_t & this) { this.tv = 0; this.ma = 0; }
    175 static inline void ^?{}(__timestamp_t &) {}
    176 
    177 struct __attribute__((aligned(128))) __ready_queue_caches_t;
    178 void  ?{}(__ready_queue_caches_t & this);
    179 void ^?{}(__ready_queue_caches_t & this);
    180 
    181 //TODO adjust cache size to ARCHITECTURE
    182 // Structure holding the ready queue
    183 struct __ready_queue_t {
    184         // Data tracking the actual lanes
    185         // On a seperate cacheline from the used struct since
    186         // used can change on each push/pop but this data
    187         // only changes on shrink/grow
    188         struct {
    189                 // Arary of lanes
    190                 __intrusive_lane_t * volatile data;
    191 
    192                 // Array of times
    193                 __timestamp_t * volatile tscs;
    194 
    195                 __cache_id_t * volatile caches;
    196 
    197                 // Array of stats
    198                 __help_cnts_t * volatile help;
    199 
    200                 // Number of lanes (empty or not)
    201                 volatile size_t count;
    202         } lanes;
    203 };
    204 
    205 void  ?{}(__ready_queue_t & this);
    206 void ^?{}(__ready_queue_t & this);
    207 #if !defined(__CFA_NO_STATISTICS__)
    208         unsigned cnt(const __ready_queue_t & this, unsigned idx);
    209 #endif
    210188
    211189// Idle Sleep
     
    233211// Cluster
    234212struct __attribute__((aligned(128))) cluster {
    235         // Ready queue for threads
    236         __ready_queue_t ready_queue;
     213        struct {
     214                struct {
     215                        // Arary of subqueues
     216                        __intrusive_lane_t * data;
     217
     218                        // Time since subqueues were processed
     219                        __timestamp_t * tscs;
     220
     221                        // Number of subqueue / timestamps
     222                        size_t count;
     223                } readyQ;
     224
     225                struct {
     226                        // Array of $io_
     227                        $io_context ** data;
     228
     229                        // Time since subqueues were processed
     230                        __timestamp_t * tscs;
     231
     232                        // Number of I/O subqueues
     233                        size_t count;
     234                } io;
     235
     236                // Cache each kernel thread belongs to
     237                __cache_id_t * caches;
     238        } sched;
     239
     240        // // Ready queue for threads
     241        // __ready_queue_t ready_queue;
    237242
    238243        // Name of the cluster
Note: See TracChangeset for help on using the changeset viewer.