public inbox for libstdc++@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH 0/3] Uncontroversial improvements to C++20 wait-related implementation
@ 2021-03-05 18:21 Thiago Macieira
  2021-03-05 18:21 ` [PATCH 1/3] Atomic __platform_wait: accept any 32-bit type, not just int Thiago Macieira
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Thiago Macieira @ 2021-03-05 18:21 UTC (permalink / raw)
  To: libstdc++; +Cc: gcc-patches

Discussion at:
https://gcc.gnu.org/pipermail/libstdc++/2021-February/052043.html

This patch set includes the uncontroversial parts that improve
performance but don't otherwise change ABI.

Please note we still need to decide on how to deal with the future ABI
break.

Thiago Macieira (3):
  Atomic __platform_wait: accept any 32-bit type, not just int
  std::latch: reduce internal implementation from ptrdiff_t to int
  barrier: optimise by not having the hasher in a loop

 libstdc++-v3/include/bits/atomic_wait.h |  7 ++++---
 libstdc++-v3/include/std/barrier        | 10 +++++-----
 libstdc++-v3/include/std/latch          |  4 ++--
 3 files changed, 11 insertions(+), 10 deletions(-)

-- 
2.30.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 1/3] Atomic __platform_wait: accept any 32-bit type, not just int
  2021-03-05 18:21 [PATCH 0/3] Uncontroversial improvements to C++20 wait-related implementation Thiago Macieira
@ 2021-03-05 18:21 ` Thiago Macieira
  2021-03-05 18:21 ` [PATCH 2/3] std::latch: reduce internal implementation from ptrdiff_t to int Thiago Macieira
  2021-03-05 18:21 ` [PATCH 3/3] barrier: optimise by not having the hasher in a loop Thiago Macieira
  2 siblings, 0 replies; 9+ messages in thread
From: Thiago Macieira @ 2021-03-05 18:21 UTC (permalink / raw)
  To: libstdc++; +Cc: gcc-patches

The kernel doesn't care what we store in those 32 bits, only that they are
comparable. This commit adds:
 * pointers and long on 32-bit architectures
 * unsigned
 * untyped enums and typed enums on int & unsigned int
 * float

We're not using FUTEX_OP anywhere today. The kernel reserves 4 bits for
this field but has only used 6 values so far, so it can be extended to
unsigned compares in the future, if needed.

libstdc++-v3/ChangeLog:

        * include/bits/atomic_wait.h: Update __platform_wait_uses_type
---
 libstdc++-v3/include/bits/atomic_wait.h | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/libstdc++-v3/include/bits/atomic_wait.h b/libstdc++-v3/include/bits/atomic_wait.h
index 424fccbe4c5..4b4573df691 100644
--- a/libstdc++-v3/include/bits/atomic_wait.h
+++ b/libstdc++-v3/include/bits/atomic_wait.h
@@ -65,7 +65,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     template<typename _Tp>
       inline constexpr bool __platform_wait_uses_type
 #ifdef _GLIBCXX_HAVE_LINUX_FUTEX
-	= is_same_v<remove_cv_t<_Tp>, __platform_wait_t>;
+	= sizeof(_Tp) == sizeof(__platform_wait_t) &&
+	  alignof(_Tp) >= alignof(__platform_wait_t);
 #else
 	= false;
 #endif
@@ -91,13 +92,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
     template<typename _Tp>
       void
-      __platform_wait(const _Tp* __addr, __platform_wait_t __val) noexcept
+      __platform_wait(const _Tp* __addr, _Tp __val) noexcept
       {
 	for(;;)
 	  {
 	    auto __e = syscall (SYS_futex, static_cast<const void*>(__addr),
 				  static_cast<int>(__futex_wait_flags::__wait_private),
-				    __val, nullptr);
+				  static_cast<__platform_wait_t>(__val), nullptr);
 	    if (!__e || errno == EAGAIN)
 	      break;
 	    else if (errno != EINTR)
-- 
2.30.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 2/3] std::latch: reduce internal implementation from ptrdiff_t to int
  2021-03-05 18:21 [PATCH 0/3] Uncontroversial improvements to C++20 wait-related implementation Thiago Macieira
  2021-03-05 18:21 ` [PATCH 1/3] Atomic __platform_wait: accept any 32-bit type, not just int Thiago Macieira
@ 2021-03-05 18:21 ` Thiago Macieira
  2021-03-05 18:21 ` [PATCH 3/3] barrier: optimise by not having the hasher in a loop Thiago Macieira
  2 siblings, 0 replies; 9+ messages in thread
From: Thiago Macieira @ 2021-03-05 18:21 UTC (permalink / raw)
  To: libstdc++; +Cc: gcc-patches

ints can be used as futex on Linux. ptrdiff_t on 64-bit Linux can't.

libstdc++-v3/ChangeLog:

        * include/std/latch: Use int instead of ptrdiff_t
---
 libstdc++-v3/include/std/latch | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/libstdc++-v3/include/std/latch b/libstdc++-v3/include/std/latch
index ef8c301e5e9..f3f73360618 100644
--- a/libstdc++-v3/include/std/latch
+++ b/libstdc++-v3/include/std/latch
@@ -48,7 +48,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   public:
     static constexpr ptrdiff_t
     max() noexcept
-    { return __gnu_cxx::__int_traits<ptrdiff_t>::__max; }
+    { return __gnu_cxx::__int_traits<int>::__max; }
 
     constexpr explicit latch(ptrdiff_t __expected) noexcept
       : _M_a(__expected) { }
@@ -85,7 +85,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     }
 
   private:
-    alignas(__alignof__(ptrdiff_t)) ptrdiff_t _M_a;
+    alignas(4) int _M_a;	// kernel requires 4-byte alignment
   };
 _GLIBCXX_END_NAMESPACE_VERSION
 } // namespace
-- 
2.30.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 3/3] barrier: optimise by not having the hasher in a loop
  2021-03-05 18:21 [PATCH 0/3] Uncontroversial improvements to C++20 wait-related implementation Thiago Macieira
  2021-03-05 18:21 ` [PATCH 1/3] Atomic __platform_wait: accept any 32-bit type, not just int Thiago Macieira
  2021-03-05 18:21 ` [PATCH 2/3] std::latch: reduce internal implementation from ptrdiff_t to int Thiago Macieira
@ 2021-03-05 18:21 ` Thiago Macieira
  2 siblings, 0 replies; 9+ messages in thread
From: Thiago Macieira @ 2021-03-05 18:21 UTC (permalink / raw)
  To: libstdc++; +Cc: gcc-patches

Our thread's ID does not change so we don't have to get it every time
and hash it every time.

libstdc++-v3/ChangeLog:

        * include/std/barrier(arrive): move hasher one level up in the
          stack.
---
 libstdc++-v3/include/std/barrier | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/libstdc++-v3/include/std/barrier b/libstdc++-v3/include/std/barrier
index e09212dfcb9..4bb5642c164 100644
--- a/libstdc++-v3/include/std/barrier
+++ b/libstdc++-v3/include/std/barrier
@@ -94,7 +94,7 @@ It looks different from literature pseudocode for two main reasons:
       alignas(__phase_alignment) __barrier_phase_t  _M_phase;
 
       bool
-      _M_arrive(__barrier_phase_t __old_phase)
+      _M_arrive(__barrier_phase_t __old_phase, size_t __current)
       {
 	const auto __old_phase_val = static_cast<unsigned char>(__old_phase);
 	const auto __half_step =
@@ -103,9 +103,7 @@ It looks different from literature pseudocode for two main reasons:
 			   static_cast<__barrier_phase_t>(__old_phase_val + 2);
 
 	size_t __current_expected = _M_expected;
-	std::hash<std::thread::id> __hasher;
-	size_t __current = __hasher(std::this_thread::get_id())
-					  % ((_M_expected + 1) >> 1);
+        __current %= ((__current_expected + 1) >> 1);
 
 	for (int __round = 0; ; ++__round)
 	  {
@@ -163,12 +161,14 @@ It looks different from literature pseudocode for two main reasons:
       [[nodiscard]] arrival_token
       arrive(ptrdiff_t __update)
       {
+	std::hash<std::thread::id> __hasher;
+	size_t __current = __hasher(std::this_thread::get_id());
 	__atomic_phase_ref_t __phase(_M_phase);
 	const auto __old_phase = __phase.load(memory_order_relaxed);
 	const auto __cur = static_cast<unsigned char>(__old_phase);
 	for(; __update; --__update)
 	  {
-	    if(_M_arrive(__old_phase))
+	    if(_M_arrive(__old_phase, __current))
 	      {
 		_M_completion();
 		_M_expected += _M_expected_adjustment.load(memory_order_relaxed);
-- 
2.30.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 0/3] Uncontroversial improvements to C++20 wait-related implementation
  2021-03-23 16:35     ` Jonathan Wakely
@ 2021-03-26 23:53       ` Thomas Rodgers
  0 siblings, 0 replies; 9+ messages in thread
From: Thomas Rodgers @ 2021-03-26 23:53 UTC (permalink / raw)
  To: Jonathan Wakely; +Cc: Thiago Macieira, libstdc++, gcc-patches

On 2021-03-23 09:35, Jonathan Wakely wrote:

> On 23/03/21 09:26 -0700, Thiago Macieira via Libstdc++ wrote: On 
> Tuesday, 23 March 2021 08:39:43 PDT Thomas Rodgers wrote: I will be 
> submitting a new patch for the
> atomic.wait/barrier/latch/semaphore functionality a bit later today 
> that
> subsumes the changes to atomic_wait and latch, and includes the changes
> to barrier.
> Thanks, Thomas
> 
> Is that meant to be part of GCC 11's release?

Yes.

> If not, what do we do about preventing the future BC break and 
> potential
> heisenbugs?
> 
> 1) do nothing, accept they will happen silently

This is our current policy for experimental features and it isn't
going to change for GCC 11.

> 2) cause non-silent BC breaks
> 3) disable the code for now (unless explicitly opted-in)
> 
> -- Thiago Macieira - thiago.macieira (AT) intel.com
> Software Architect - Intel DPG Cloud Engineering

FWIW, I would like to commit to an ABI for this with GCC12 and 
everything currently residing in the __detail namespace would be moved 
into the .so as part of that (likely with a third, and ideally final, 
rewrite).

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 0/3] Uncontroversial improvements to C++20 wait-related implementation
  2021-03-23 16:26   ` Thiago Macieira
@ 2021-03-23 16:35     ` Jonathan Wakely
  2021-03-26 23:53       ` Thomas Rodgers
  0 siblings, 1 reply; 9+ messages in thread
From: Jonathan Wakely @ 2021-03-23 16:35 UTC (permalink / raw)
  To: Thiago Macieira; +Cc: Thomas Rodgers, libstdc++, gcc-patches

On 23/03/21 09:26 -0700, Thiago Macieira via Libstdc++ wrote:
>On Tuesday, 23 March 2021 08:39:43 PDT Thomas Rodgers wrote:
>> I will be submitting a new patch for the
>> atomic.wait/barrier/latch/semaphore functionality a bit later today that
>> subsumes the changes to atomic_wait and latch, and includes the changes
>> to barrier.
>
>Thanks, Thomas
>
>Is that meant to be part of GCC 11's release?

Yes.

>If not, what do we do about preventing the future BC break and potential
>heisenbugs?
>
> 1) do nothing, accept they will happen silently

This is our current policy for experimental features and it isn't
going to change for GCC 11.


> 2) cause non-silent BC breaks
> 3) disable the code for now (unless explicitly opted-in)
>
>-- 
>Thiago Macieira - thiago.macieira (AT) intel.com
>  Software Architect - Intel DPG Cloud Engineering
>
>
>


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 0/3] Uncontroversial improvements to C++20 wait-related implementation
  2021-03-23 15:39 ` Thomas Rodgers
@ 2021-03-23 16:26   ` Thiago Macieira
  2021-03-23 16:35     ` Jonathan Wakely
  0 siblings, 1 reply; 9+ messages in thread
From: Thiago Macieira @ 2021-03-23 16:26 UTC (permalink / raw)
  To: Thomas Rodgers; +Cc: libstdc++, gcc-patches

On Tuesday, 23 March 2021 08:39:43 PDT Thomas Rodgers wrote:
> I will be submitting a new patch for the
> atomic.wait/barrier/latch/semaphore functionality a bit later today that
> subsumes the changes to atomic_wait and latch, and includes the changes
> to barrier.

Thanks, Thomas

Is that meant to be part of GCC 11's release?

If not, what do we do about preventing the future BC break and potential 
heisenbugs?

 1) do nothing, accept they will happen silently
 2) cause non-silent BC breaks
 3) disable the code for now (unless explicitly opted-in)

-- 
Thiago Macieira - thiago.macieira (AT) intel.com
  Software Architect - Intel DPG Cloud Engineering




^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 0/3] Uncontroversial improvements to C++20 wait-related implementation
  2021-03-22 15:29 [PATCH 0/3] Uncontroversial improvements to C++20 wait-related implementation Thiago Macieira
@ 2021-03-23 15:39 ` Thomas Rodgers
  2021-03-23 16:26   ` Thiago Macieira
  0 siblings, 1 reply; 9+ messages in thread
From: Thomas Rodgers @ 2021-03-23 15:39 UTC (permalink / raw)
  To: Thiago Macieira; +Cc: libstdc++, gcc-patches

On 2021-03-22 08:29, Thiago Macieira via Libstdc++ wrote:

>> Discussion at:
>> https://gcc.gnu.org/pipermail/libstdc++/2021-February/052043.html
>> 
>> This patch set includes the uncontroversial parts that improve
>> performance but don't otherwise change ABI.
>> 
>> Please note we still need to decide on how to deal with the future ABI
>> break.
>> 
>> Thiago Macieira (3):
>> Atomic __platform_wait: accept any 32-bit type, not just int
>> std::latch: reduce internal implementation from ptrdiff_t to int
>> barrier: optimise by not having the hasher in a loop
>> 
>> libstdc++-v3/include/bits/atomic_wait.h |  7 ++++---
>> libstdc++-v3/include/std/barrier        | 10 +++++-----
>> libstdc++-v3/include/std/latch          |  4 ++--
>> 3 files changed, 11 insertions(+), 10 deletions(-)
> 
> ping?

I will be submitting a new patch for the 
atomic.wait/barrier/latch/semaphore functionality a bit later today that 
subsumes the changes to atomic_wait and latch, and includes the changes 
to barrier.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 0/3] Uncontroversial improvements to C++20 wait-related implementation
@ 2021-03-22 15:29 Thiago Macieira
  2021-03-23 15:39 ` Thomas Rodgers
  0 siblings, 1 reply; 9+ messages in thread
From: Thiago Macieira @ 2021-03-22 15:29 UTC (permalink / raw)
  To: libstdc++; +Cc: gcc-patches

> Discussion at:
> https://gcc.gnu.org/pipermail/libstdc++/2021-February/052043.html
> 
> This patch set includes the uncontroversial parts that improve
> performance but don't otherwise change ABI.
> 
> Please note we still need to decide on how to deal with the future ABI
> break.
> 
> Thiago Macieira (3):
>   Atomic __platform_wait: accept any 32-bit type, not just int
>   std::latch: reduce internal implementation from ptrdiff_t to int
>   barrier: optimise by not having the hasher in a loop
>  
>  libstdc++-v3/include/bits/atomic_wait.h |  7 ++++---
>  libstdc++-v3/include/std/barrier        | 10 +++++-----
>  libstdc++-v3/include/std/latch          |  4 ++--
>  3 files changed, 11 insertions(+), 10 deletions(-)

ping?
-- 
Thiago Macieira - thiago.macieira (AT) intel.com
  Software Architect - Intel DPG Cloud Engineering




^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2021-03-26 23:53 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-03-05 18:21 [PATCH 0/3] Uncontroversial improvements to C++20 wait-related implementation Thiago Macieira
2021-03-05 18:21 ` [PATCH 1/3] Atomic __platform_wait: accept any 32-bit type, not just int Thiago Macieira
2021-03-05 18:21 ` [PATCH 2/3] std::latch: reduce internal implementation from ptrdiff_t to int Thiago Macieira
2021-03-05 18:21 ` [PATCH 3/3] barrier: optimise by not having the hasher in a loop Thiago Macieira
2021-03-22 15:29 [PATCH 0/3] Uncontroversial improvements to C++20 wait-related implementation Thiago Macieira
2021-03-23 15:39 ` Thomas Rodgers
2021-03-23 16:26   ` Thiago Macieira
2021-03-23 16:35     ` Jonathan Wakely
2021-03-26 23:53       ` Thomas Rodgers

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).