Changeset b9376fe for libcfa/src/concurrency/ready_queue.cfa
- Timestamp:
- May 5, 2021, 2:12:36 PM (4 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 7f54356, a67c5b6
- Parents:
- 4026d1be (diff), f302d80 (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. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/ready_queue.cfa
r4026d1be rb9376fe 398 398 399 399 if(proc->rdq.target == -1u) { 400 proc->rdq.target = __tls_rand() % lanes.count; 401 unsigned it1 = proc->rdq.itr; 402 unsigned it2 = proc->rdq.itr + 1; 403 unsigned idx1 = proc->rdq.id + (it1 % READYQ_SHARD_FACTOR); 404 unsigned idx2 = proc->rdq.id + (it2 % READYQ_SHARD_FACTOR); 400 _Static_assert(READYQ_SHARD_FACTOR == 2); 401 unsigned idx1 = proc->rdq.id + 0; 402 unsigned idx2 = proc->rdq.id + 1; 405 403 unsigned long long tsc1 = ts(lanes.data[idx1]); 406 404 unsigned long long tsc2 = ts(lanes.data[idx2]); 407 proc->rdq.cutoff = min(tsc1, tsc2); 408 if(proc->rdq.cutoff == 0) proc->rdq.cutoff = -1ull; 405 proc->rdq.target = __tls_rand() % lanes.count; 406 407 // WARNING: std::min is polymorphic and therefore causes 500% slowdown instead of the expected 2% 408 proc->rdq.cutoff = tsc1 < tsc2 ? tsc1 : tsc2; 409 409 } 410 410 else { … … 418 418 419 419 for(READYQ_SHARD_FACTOR) { 420 unsigned i = proc->rdq.id + ( --proc->rdq.itr% READYQ_SHARD_FACTOR);420 unsigned i = proc->rdq.id + (proc->rdq.itr++ % READYQ_SHARD_FACTOR); 421 421 if($thread * t = try_pop(cltr, i __STATS(, __tls_stats()->ready.pop.local))) return t; 422 422 } … … 469 469 // Actually pop the list 470 470 struct $thread * thrd; 471 thrd = pop(lane); 471 unsigned long long tsv; 472 [thrd, tsv] = pop(lane); 472 473 473 474 /* paranoid */ verify(thrd); … … 481 482 482 483 #if defined(USE_WORK_STEALING) 483 lanes.tscs[w].tv = t hrd->link.ts;484 lanes.tscs[w].tv = tsv; 484 485 #endif 485 486 … … 663 664 while(!is_empty(lanes.data[idx])) { 664 665 struct $thread * thrd; 665 thrd = pop(lanes.data[idx]); 666 unsigned long long _; 667 [thrd, _] = pop(lanes.data[idx]); 666 668 667 669 push(cltr, thrd);
Note: See TracChangeset
for help on using the changeset viewer.