Skip to content

Commit 552425d

Browse files
Hui XieHui Xie
Hui Xie
authored and
Hui Xie
committed
[libc++] remove yield from atomic::wait
1 parent a87c430 commit 552425d

File tree

2 files changed

+62
-64
lines changed

2 files changed

+62
-64
lines changed

libcxx/include/__atomic/atomic_sync.h

+2-4
Original file line numberDiff line numberDiff line change
@@ -108,15 +108,13 @@ struct __atomic_wait_backoff_impl {
108108

109109
_LIBCPP_AVAILABILITY_SYNC
110110
_LIBCPP_HIDE_FROM_ABI bool operator()(chrono::nanoseconds __elapsed) const {
111-
if (__elapsed > chrono::microseconds(64)) {
111+
if (__elapsed > chrono::microseconds(4)) {
112112
auto __contention_address = __waitable_traits::__atomic_contention_address(__a_);
113113
__cxx_contention_t __monitor_val;
114114
if (__update_monitor_val_and_poll(__contention_address, __monitor_val))
115115
return true;
116116
std::__libcpp_atomic_wait(__contention_address, __monitor_val);
117-
} else if (__elapsed > chrono::microseconds(4))
118-
__libcpp_thread_yield();
119-
else {
117+
} else {
120118
} // poll
121119
return false;
122120
}

libcxx/test/benchmarks/atomic_wait.bench.cpp

+60-60
Original file line numberDiff line numberDiff line change
@@ -107,17 +107,17 @@ void BM_1_atomic_1_waiter_1_notifier(benchmark::State& state) {
107107
}
108108
}
109109

110-
BENCHMARK(BM_1_atomic_1_waiter_1_notifier<KeepNotifying, NumHighPrioTasks<0>>)->RangeMultiplier(2)->Range(1 << 10, 1 << 24);
111-
BENCHMARK(BM_1_atomic_1_waiter_1_notifier<NotifyEveryNus<50>, NumHighPrioTasks<0>>)->RangeMultiplier(2)->Range(1 << 10, 1 << 16);
112-
BENCHMARK(BM_1_atomic_1_waiter_1_notifier<NotifyEveryNus<100>, NumHighPrioTasks<0>>)->RangeMultiplier(2)->Range(1 << 10, 1 << 16);
110+
BENCHMARK(BM_1_atomic_1_waiter_1_notifier<KeepNotifying, NumHighPrioTasks<0>>)->RangeMultiplier(2)->Range(1 << 18, 1 << 20);
111+
BENCHMARK(BM_1_atomic_1_waiter_1_notifier<NotifyEveryNus<50>, NumHighPrioTasks<0>>)->RangeMultiplier(2)->Range(1 << 12, 1 << 14);
112+
BENCHMARK(BM_1_atomic_1_waiter_1_notifier<NotifyEveryNus<100>, NumHighPrioTasks<0>>)->RangeMultiplier(2)->Range(1 << 12, 1 << 14);
113113

114-
BENCHMARK(BM_1_atomic_1_waiter_1_notifier<KeepNotifying, NumHighPrioTasks<4>>)->RangeMultiplier(2)->Range(1 << 10, 1 << 24);
115-
BENCHMARK(BM_1_atomic_1_waiter_1_notifier<NotifyEveryNus<50>, NumHighPrioTasks<4>>)->RangeMultiplier(2)->Range(1 << 10, 1 << 16);
116-
BENCHMARK(BM_1_atomic_1_waiter_1_notifier<NotifyEveryNus<100>, NumHighPrioTasks<4>>)->RangeMultiplier(2)->Range(1 << 10, 1 << 16);
114+
BENCHMARK(BM_1_atomic_1_waiter_1_notifier<KeepNotifying, NumHighPrioTasks<4>>)->RangeMultiplier(2)->Range(1 << 18, 1 << 20);
115+
BENCHMARK(BM_1_atomic_1_waiter_1_notifier<NotifyEveryNus<50>, NumHighPrioTasks<4>>)->RangeMultiplier(2)->Range(1 << 12, 1 << 14);
116+
BENCHMARK(BM_1_atomic_1_waiter_1_notifier<NotifyEveryNus<100>, NumHighPrioTasks<4>>)->RangeMultiplier(2)->Range(1 << 12, 1 << 14);
117117

118-
BENCHMARK(BM_1_atomic_1_waiter_1_notifier<KeepNotifying, NumHighPrioTasks<7>>)->RangeMultiplier(2)->Range(1 << 4, 1 << 8);
119-
BENCHMARK(BM_1_atomic_1_waiter_1_notifier<NotifyEveryNus<50>, NumHighPrioTasks<7>>)->RangeMultiplier(2)->Range(1 << 4, 1 << 8);
120-
BENCHMARK(BM_1_atomic_1_waiter_1_notifier<NotifyEveryNus<100>, NumHighPrioTasks<7>>)->RangeMultiplier(2)->Range(1 << 4, 1 << 8);
118+
BENCHMARK(BM_1_atomic_1_waiter_1_notifier<KeepNotifying, NumHighPrioTasks<7>>)->RangeMultiplier(2)->Range(1 << 4, 1 << 6);
119+
BENCHMARK(BM_1_atomic_1_waiter_1_notifier<NotifyEveryNus<50>, NumHighPrioTasks<7>>)->RangeMultiplier(2)->Range(1 << 3, 1 << 5);
120+
BENCHMARK(BM_1_atomic_1_waiter_1_notifier<NotifyEveryNus<100>, NumHighPrioTasks<7>>)->RangeMultiplier(2)->Range(1 << 3, 1 << 5);
121121

122122

123123
template <std::size_t N>
@@ -177,94 +177,94 @@ void BM_1_atomic_multi_waiter_1_notifier(benchmark::State& state) {
177177
}
178178
BENCHMARK(BM_1_atomic_multi_waiter_1_notifier<KeepNotifying, NumWaitingThreads<3>, NumHighPrioTasks<0>>)
179179
->RangeMultiplier(2)
180-
->Range(1 << 10, 1 << 20);
180+
->Range(1 << 14, 1 << 16);
181181
BENCHMARK(BM_1_atomic_multi_waiter_1_notifier<KeepNotifying, NumWaitingThreads<7>, NumHighPrioTasks<0>>)
182182
->RangeMultiplier(2)
183-
->Range(1 << 10, 1 << 20);
183+
->Range(1 << 12, 1 << 14);
184184
BENCHMARK(BM_1_atomic_multi_waiter_1_notifier<KeepNotifying, NumWaitingThreads<15>, NumHighPrioTasks<0>>)
185185
->RangeMultiplier(2)
186-
->Range(1 << 10, 1 << 20);
186+
->Range(1 << 10, 1 << 12);
187187

188188
BENCHMARK(BM_1_atomic_multi_waiter_1_notifier<NotifyEveryNus<50>, NumWaitingThreads<3>, NumHighPrioTasks<0>>)
189189
->RangeMultiplier(2)
190-
->Range(1 << 10, 1 << 16);
190+
->Range(1 << 10, 1 << 12);
191191
BENCHMARK(BM_1_atomic_multi_waiter_1_notifier<NotifyEveryNus<50>, NumWaitingThreads<7>, NumHighPrioTasks<0>>)
192192
->RangeMultiplier(2)
193-
->Range(1 << 10, 1 << 16);
193+
->Range(1 << 8, 1 << 10);
194194
BENCHMARK(BM_1_atomic_multi_waiter_1_notifier<NotifyEveryNus<50>, NumWaitingThreads<15>, NumHighPrioTasks<0>>)
195195
->RangeMultiplier(2)
196-
->Range(1 << 10, 1 << 16);
196+
->Range(1 << 6, 1 << 8);
197197

198198
BENCHMARK(BM_1_atomic_multi_waiter_1_notifier<NotifyEveryNus<100>, NumWaitingThreads<3>, NumHighPrioTasks<0>>)
199199
->RangeMultiplier(2)
200-
->Range(1 << 8, 1 << 14);
200+
->Range(1 << 8, 1 << 10);
201201
BENCHMARK(BM_1_atomic_multi_waiter_1_notifier<NotifyEveryNus<100>, NumWaitingThreads<7>, NumHighPrioTasks<0>>)
202202
->RangeMultiplier(2)
203-
->Range(1 << 8, 1 << 14);
203+
->Range(1 << 6, 1 << 8);
204204
BENCHMARK(BM_1_atomic_multi_waiter_1_notifier<NotifyEveryNus<100>, NumWaitingThreads<15>, NumHighPrioTasks<0>>)
205205
->RangeMultiplier(2)
206-
->Range(1 << 8, 1 << 14);
206+
->Range(1 << 4, 1 << 6);
207207

208208

209209
BENCHMARK(BM_1_atomic_multi_waiter_1_notifier<KeepNotifying, NumWaitingThreads<3>, NumHighPrioTasks<4>>)
210210
->RangeMultiplier(2)
211-
->Range(1 << 10, 1 << 18);
211+
->Range(1 << 8, 1 << 10);
212212
BENCHMARK(BM_1_atomic_multi_waiter_1_notifier<KeepNotifying, NumWaitingThreads<7>, NumHighPrioTasks<4>>)
213213
->RangeMultiplier(2)
214-
->Range(1 << 10, 1 << 18);
214+
->Range(1 << 6, 1 << 8);
215215
BENCHMARK(BM_1_atomic_multi_waiter_1_notifier<KeepNotifying, NumWaitingThreads<15>, NumHighPrioTasks<4>>)
216216
->RangeMultiplier(2)
217-
->Range(1 << 10, 1 << 18);
217+
->Range(1 << 4, 1 << 6);
218218

219219
BENCHMARK(BM_1_atomic_multi_waiter_1_notifier<NotifyEveryNus<50>, NumWaitingThreads<3>, NumHighPrioTasks<4>>)
220220
->RangeMultiplier(2)
221-
->Range(1 << 10, 1 << 14);
221+
->Range(1 << 8, 1 << 10);
222222
BENCHMARK(BM_1_atomic_multi_waiter_1_notifier<NotifyEveryNus<50>, NumWaitingThreads<7>, NumHighPrioTasks<4>>)
223223
->RangeMultiplier(2)
224-
->Range(1 << 10, 1 << 14);
224+
->Range(1 << 6, 1 << 8);
225225
BENCHMARK(BM_1_atomic_multi_waiter_1_notifier<NotifyEveryNus<50>, NumWaitingThreads<15>, NumHighPrioTasks<4>>)
226226
->RangeMultiplier(2)
227-
->Range(1 << 10, 1 << 14);
227+
->Range(1 << 4, 1 << 6);
228228

229229
BENCHMARK(BM_1_atomic_multi_waiter_1_notifier<NotifyEveryNus<100>, NumWaitingThreads<3>, NumHighPrioTasks<4>>)
230230
->RangeMultiplier(2)
231-
->Range(1 << 8, 1 << 14);
231+
->Range(1 << 8, 1 << 10);
232232
BENCHMARK(BM_1_atomic_multi_waiter_1_notifier<NotifyEveryNus<100>, NumWaitingThreads<7>, NumHighPrioTasks<4>>)
233233
->RangeMultiplier(2)
234-
->Range(1 << 8, 1 << 14);
234+
->Range(1 << 6, 1 << 8);
235235
BENCHMARK(BM_1_atomic_multi_waiter_1_notifier<NotifyEveryNus<100>, NumWaitingThreads<15>, NumHighPrioTasks<4>>)
236236
->RangeMultiplier(2)
237-
->Range(1 << 8, 1 << 14);
237+
->Range(1 << 4, 1 << 6);
238238

239239
BENCHMARK(BM_1_atomic_multi_waiter_1_notifier<KeepNotifying, NumWaitingThreads<3>, NumHighPrioTasks<7>>)
240240
->RangeMultiplier(2)
241-
->Range(1 << 4, 1 << 8);
241+
->Range(1 << 4, 1 << 6);
242242
BENCHMARK(BM_1_atomic_multi_waiter_1_notifier<KeepNotifying, NumWaitingThreads<7>, NumHighPrioTasks<7>>)
243243
->RangeMultiplier(2)
244-
->Range(1 << 4, 1 << 8);
244+
->Range(1 << 3, 1 << 5);
245245
BENCHMARK(BM_1_atomic_multi_waiter_1_notifier<KeepNotifying, NumWaitingThreads<15>, NumHighPrioTasks<7>>)
246246
->RangeMultiplier(2)
247-
->Range(1 << 4, 1 << 8);
247+
->Range(1 << 2, 1 << 4);
248248

249249
BENCHMARK(BM_1_atomic_multi_waiter_1_notifier<NotifyEveryNus<50>, NumWaitingThreads<3>, NumHighPrioTasks<7>>)
250250
->RangeMultiplier(2)
251-
->Range(1 << 4, 1 << 8);
251+
->Range(1 << 3, 1 << 5);
252252
BENCHMARK(BM_1_atomic_multi_waiter_1_notifier<NotifyEveryNus<50>, NumWaitingThreads<7>, NumHighPrioTasks<7>>)
253253
->RangeMultiplier(2)
254-
->Range(1 << 4, 1 << 8);
254+
->Range(1 << 2, 1 << 4);
255255
BENCHMARK(BM_1_atomic_multi_waiter_1_notifier<NotifyEveryNus<50>, NumWaitingThreads<15>, NumHighPrioTasks<7>>)
256256
->RangeMultiplier(2)
257-
->Range(1 << 4, 1 << 8);
257+
->Range(1 << 1, 1 << 3);
258258

259259
BENCHMARK(BM_1_atomic_multi_waiter_1_notifier<NotifyEveryNus<100>, NumWaitingThreads<3>, NumHighPrioTasks<7>>)
260260
->RangeMultiplier(2)
261-
->Range(1 << 4, 1 << 8);
261+
->Range(1 << 3, 1 << 5);
262262
BENCHMARK(BM_1_atomic_multi_waiter_1_notifier<NotifyEveryNus<100>, NumWaitingThreads<7>, NumHighPrioTasks<7>>)
263263
->RangeMultiplier(2)
264-
->Range(1 << 4, 1 << 8);
264+
->Range(1 << 2, 1 << 4);
265265
BENCHMARK(BM_1_atomic_multi_waiter_1_notifier<NotifyEveryNus<100>, NumWaitingThreads<15>, NumHighPrioTasks<7>>)
266266
->RangeMultiplier(2)
267-
->Range(1 << 4, 1 << 8);
267+
->Range(1 << 1, 1 << 3);
268268

269269

270270
template <std::size_t N>
@@ -335,81 +335,81 @@ void BM_N_atomics_N_waiter_N_notifier(benchmark::State& state) {
335335

336336
BENCHMARK(BM_N_atomics_N_waiter_N_notifier<KeepNotifying, NumberOfAtomics<2>, NumHighPrioTasks<0>>)
337337
->RangeMultiplier(2)
338-
->Range(1 << 10, 1 << 20);
338+
->Range(1 << 12, 1 << 14);
339339
BENCHMARK(BM_N_atomics_N_waiter_N_notifier<KeepNotifying, NumberOfAtomics<3>, NumHighPrioTasks<0>>)
340340
->RangeMultiplier(2)
341-
->Range(1 << 10, 1 << 20);
341+
->Range(1 << 10, 1 << 12);
342342
BENCHMARK(BM_N_atomics_N_waiter_N_notifier<KeepNotifying, NumberOfAtomics<5>, NumHighPrioTasks<0>>)
343343
->RangeMultiplier(2)
344-
->Range(1 << 10, 1 << 20);
344+
->Range(1 << 10, 1 << 12);
345345
BENCHMARK(BM_N_atomics_N_waiter_N_notifier<KeepNotifying, NumberOfAtomics<7>, NumHighPrioTasks<0>>)
346346
->RangeMultiplier(2)
347-
->Range(1 << 10, 1 << 20);
347+
->Range(1 << 8, 1 << 10);
348348

349349
BENCHMARK(BM_N_atomics_N_waiter_N_notifier<NotifyEveryNus<50>, NumberOfAtomics<2>, NumHighPrioTasks<0>>)
350350
->RangeMultiplier(2)
351-
->Range(1 << 10, 1 << 16);
351+
->Range(1 << 10, 1 << 12);
352352
BENCHMARK(BM_N_atomics_N_waiter_N_notifier<NotifyEveryNus<50>, NumberOfAtomics<3>, NumHighPrioTasks<0>>)
353353
->RangeMultiplier(2)
354-
->Range(1 << 10, 1 << 16);
354+
->Range(1 << 8, 1 << 10);
355355
BENCHMARK(BM_N_atomics_N_waiter_N_notifier<NotifyEveryNus<50>, NumberOfAtomics<5>, NumHighPrioTasks<0>>)
356356
->RangeMultiplier(2)
357-
->Range(1 << 10, 1 << 16);
357+
->Range(1 << 8, 1 << 10);
358358
BENCHMARK(BM_N_atomics_N_waiter_N_notifier<NotifyEveryNus<50>, NumberOfAtomics<7>, NumHighPrioTasks<0>>)
359359
->RangeMultiplier(2)
360-
->Range(1 << 10, 1 << 16);
360+
->Range(1 << 6, 1 << 8);
361361

362362
BENCHMARK(BM_N_atomics_N_waiter_N_notifier<NotifyEveryNus<100>, NumberOfAtomics<2>, NumHighPrioTasks<0>>)
363363
->RangeMultiplier(2)
364-
->Range(1 << 8, 1 << 14);
364+
->Range(1 << 8, 1 << 10);
365365
BENCHMARK(BM_N_atomics_N_waiter_N_notifier<NotifyEveryNus<100>, NumberOfAtomics<3>, NumHighPrioTasks<0>>)
366366
->RangeMultiplier(2)
367-
->Range(1 << 8, 1 << 14);
367+
->Range(1 << 8, 1 << 10);
368368
BENCHMARK(BM_N_atomics_N_waiter_N_notifier<NotifyEveryNus<100>, NumberOfAtomics<5>, NumHighPrioTasks<0>>)
369369
->RangeMultiplier(2)
370-
->Range(1 << 8, 1 << 14);
370+
->Range(1 << 7, 1 << 9);
371371
BENCHMARK(BM_N_atomics_N_waiter_N_notifier<NotifyEveryNus<100>, NumberOfAtomics<7>, NumHighPrioTasks<0>>)
372372
->RangeMultiplier(2)
373-
->Range(1 << 8, 1 << 14);
373+
->Range(1 << 6, 1 << 8);
374374

375375
BENCHMARK(BM_N_atomics_N_waiter_N_notifier<KeepNotifying, NumberOfAtomics<2>, NumHighPrioTasks<4>>)
376376
->RangeMultiplier(2)
377-
->Range(1 << 10, 1 << 20);
377+
->Range(1 << 7, 1 << 9);
378378
BENCHMARK(BM_N_atomics_N_waiter_N_notifier<KeepNotifying, NumberOfAtomics<3>, NumHighPrioTasks<4>>)
379379
->RangeMultiplier(2)
380-
->Range(1 << 10, 1 << 20);
380+
->Range(1 << 7, 1 << 9);
381381
BENCHMARK(BM_N_atomics_N_waiter_N_notifier<KeepNotifying, NumberOfAtomics<5>, NumHighPrioTasks<4>>)
382382
->RangeMultiplier(2)
383-
->Range(1 << 10, 1 << 20);
383+
->Range(1 << 6, 1 << 8);
384384
BENCHMARK(BM_N_atomics_N_waiter_N_notifier<KeepNotifying, NumberOfAtomics<7>, NumHighPrioTasks<4>>)
385385
->RangeMultiplier(2)
386-
->Range(1 << 10, 1 << 20);
386+
->Range(1 << 4, 1 << 6);
387387

388388
BENCHMARK(BM_N_atomics_N_waiter_N_notifier<NotifyEveryNus<50>, NumberOfAtomics<2>, NumHighPrioTasks<4>>)
389389
->RangeMultiplier(2)
390-
->Range(1 << 10, 1 << 16);
390+
->Range(1 << 7, 1 << 9);
391391
BENCHMARK(BM_N_atomics_N_waiter_N_notifier<NotifyEveryNus<50>, NumberOfAtomics<3>, NumHighPrioTasks<4>>)
392392
->RangeMultiplier(2)
393-
->Range(1 << 10, 1 << 16);
393+
->Range(1 << 7, 1 << 9);
394394
BENCHMARK(BM_N_atomics_N_waiter_N_notifier<NotifyEveryNus<50>, NumberOfAtomics<5>, NumHighPrioTasks<4>>)
395395
->RangeMultiplier(2)
396-
->Range(1 << 10, 1 << 16);
396+
->Range(1 << 5, 1 << 7);
397397
BENCHMARK(BM_N_atomics_N_waiter_N_notifier<NotifyEveryNus<50>, NumberOfAtomics<7>, NumHighPrioTasks<4>>)
398398
->RangeMultiplier(2)
399-
->Range(1 << 10, 1 << 16);
399+
->Range(1 << 3, 1 << 5);
400400

401401

402402
BENCHMARK(BM_N_atomics_N_waiter_N_notifier<NotifyEveryNus<100>, NumberOfAtomics<2>, NumHighPrioTasks<4>>)
403403
->RangeMultiplier(2)
404-
->Range(1 << 8, 1 << 14);
404+
->Range(1 << 6, 1 << 8);
405405
BENCHMARK(BM_N_atomics_N_waiter_N_notifier<NotifyEveryNus<100>, NumberOfAtomics<3>, NumHighPrioTasks<4>>)
406406
->RangeMultiplier(2)
407-
->Range(1 << 8, 1 << 14);
407+
->Range(1 << 6, 1 << 8);
408408
BENCHMARK(BM_N_atomics_N_waiter_N_notifier<NotifyEveryNus<100>, NumberOfAtomics<5>, NumHighPrioTasks<4>>)
409409
->RangeMultiplier(2)
410-
->Range(1 << 6, 1 << 10);
410+
->Range(1 << 5, 1 << 7);
411411
BENCHMARK(BM_N_atomics_N_waiter_N_notifier<NotifyEveryNus<100>, NumberOfAtomics<7>, NumHighPrioTasks<4>>)
412412
->RangeMultiplier(2)
413-
->Range(1 << 4, 1 << 8);
413+
->Range(1 << 3, 1 << 5);
414414

415415
BENCHMARK_MAIN();

0 commit comments

Comments
 (0)