- File:
-
- 1 edited
-
libcfa/src/concurrency/kernel_private.hfa (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/kernel_private.hfa
r13fdf86 rbfb9bf5 365 365 void ready_queue_shrink(struct cluster * cltr); 366 366 367 //----------------------------------------------------------------------- 368 // Decrease the width of the ready queue (number of lanes) by 4 369 void ready_queue_close(struct cluster * cltr); 370 371 //----------------------------------------------------------------------- 372 // Calc moving average based on existing average, before and current time. 373 static inline unsigned long long moving_average(unsigned long long currtsc, unsigned long long instsc, unsigned long long old_avg) { 374 /* paranoid */ verifyf( currtsc < 45000000000000000, "Suspiciously large current time: %'llu (%llx)\n", currtsc, currtsc ); 375 /* paranoid */ verifyf( instsc < 45000000000000000, "Suspiciously large insert time: %'llu (%llx)\n", instsc, instsc ); 376 /* paranoid */ verifyf( old_avg < 15000000000000, "Suspiciously large previous average: %'llu (%llx)\n", old_avg, old_avg ); 377 378 const unsigned long long new_val = currtsc > instsc ? currtsc - instsc : 0; 379 const unsigned long long total_weight = 16; 380 const unsigned long long new_weight = 4; 381 const unsigned long long old_weight = total_weight - new_weight; 382 const unsigned long long ret = ((new_weight * new_val) + (old_weight * old_avg)) / total_weight; 383 return ret; 384 } 385 386 //----------------------------------------------------------------------- 387 // Calc age a timestamp should be before needing help. 388 forall(Data_t * | { unsigned long long ts(Data_t & this); }) 389 static inline unsigned long long calc_cutoff( 390 const unsigned long long ctsc, 391 const processor * proc, 392 size_t count, 393 Data_t * data, 394 __timestamp_t * tscs, 395 const unsigned shard_factor 396 ) { 397 unsigned start = proc->rdq.id; 398 unsigned long long max = 0; 399 for(i; shard_factor) { 400 unsigned long long ptsc = ts(data[start + i]); 401 if(ptsc != -1ull) { 402 /* paranoid */ verify( start + i < count ); 403 unsigned long long tsc = moving_average(ctsc, ptsc, tscs[start + i].ma); 404 if(tsc > max) max = tsc; 405 } 406 } 407 return (max + 2 * max) / 2; 408 } 409 410 static struct { 411 const unsigned readyq; 412 } __shard_factor __attribute__((unused)) = { 2 }; 367 413 368 414 // Local Variables: //
Note:
See TracChangeset
for help on using the changeset viewer.