Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 2 additions & 5 deletions libcxx/include/__atomic/atomic_sync.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
#include <__config>
#include <__memory/addressof.h>
#include <__thread/poll_with_backoff.h>
#include <__thread/support.h>
#include <__type_traits/conjunction.h>
#include <__type_traits/decay.h>
#include <__type_traits/invoke.h>
Expand Down Expand Up @@ -108,15 +107,13 @@ struct __atomic_wait_backoff_impl {

_LIBCPP_AVAILABILITY_SYNC
_LIBCPP_HIDE_FROM_ABI bool operator()(chrono::nanoseconds __elapsed) const {
if (__elapsed > chrono::microseconds(64)) {
if (__elapsed > chrono::microseconds(4)) {
auto __contention_address = __waitable_traits::__atomic_contention_address(__a_);
__cxx_contention_t __monitor_val;
if (__update_monitor_val_and_poll(__contention_address, __monitor_val))
return true;
std::__libcpp_atomic_wait(__contention_address, __monitor_val);
} else if (__elapsed > chrono::microseconds(4))
__libcpp_thread_yield();
else {
} else {
} // poll
return false;
}
Expand Down
159 changes: 0 additions & 159 deletions libcxx/test/benchmarks/atomic_wait.bench.cpp

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

// UNSUPPORTED: c++03, c++11, c++14, c++17

#include "atomic_wait_helper.h"

#include <atomic>
#include <array>
#include <chrono>
#include <cstdint>
#include <numeric>
#include <stop_token>
#include <thread>

#include "benchmark/benchmark.h"
#include "make_test_thread.h"

using namespace std::chrono_literals;

template <class NotifyPolicy, class NumPrioTasks>
void BM_1_atomic_1_waiter_1_notifier(benchmark::State& state) {
[[maybe_unused]] std::array<HighPrioTask, NumPrioTasks::value> tasks{};
std::atomic<std::uint64_t> a;
auto thread_func = [&](std::stop_token st) { NotifyPolicy::notify(a, st); };

std::uint64_t total_loop_test_param = state.range(0);

auto thread = support::make_test_jthread(thread_func);

for (auto _ : state) {
for (std::uint64_t i = 0; i < total_loop_test_param; ++i) {
auto old = a.load(std::memory_order_relaxed);
a.wait(old);
}
}
}

BENCHMARK(BM_1_atomic_1_waiter_1_notifier<KeepNotifying, NumHighPrioTasks<0>>)
->RangeMultiplier(2)
->Range(1 << 16, 1 << 18);
BENCHMARK(BM_1_atomic_1_waiter_1_notifier<NotifyEveryNus<50>, NumHighPrioTasks<0>>)
->RangeMultiplier(2)
->Range(1 << 10, 1 << 12);
BENCHMARK(BM_1_atomic_1_waiter_1_notifier<NotifyEveryNus<100>, NumHighPrioTasks<0>>)
->RangeMultiplier(2)
->Range(1 << 10, 1 << 12);

BENCHMARK(BM_1_atomic_1_waiter_1_notifier<KeepNotifying, NumHighPrioTasks<4>>)
->RangeMultiplier(2)
->Range(1 << 16, 1 << 18);
BENCHMARK(BM_1_atomic_1_waiter_1_notifier<NotifyEveryNus<50>, NumHighPrioTasks<4>>)
->RangeMultiplier(2)
->Range(1 << 10, 1 << 12);
BENCHMARK(BM_1_atomic_1_waiter_1_notifier<NotifyEveryNus<100>, NumHighPrioTasks<4>>)
->RangeMultiplier(2)
->Range(1 << 10, 1 << 12);

BENCHMARK(BM_1_atomic_1_waiter_1_notifier<KeepNotifying, NumHighPrioTasks<7>>)
->RangeMultiplier(2)
->Range(1 << 4, 1 << 6);
BENCHMARK(BM_1_atomic_1_waiter_1_notifier<NotifyEveryNus<50>, NumHighPrioTasks<7>>)
->RangeMultiplier(2)
->Range(1 << 3, 1 << 5);
BENCHMARK(BM_1_atomic_1_waiter_1_notifier<NotifyEveryNus<100>, NumHighPrioTasks<7>>)
->RangeMultiplier(2)
->Range(1 << 3, 1 << 5);

BENCHMARK_MAIN();
Loading
Loading