improve future::poll calibration loop

Jonathan Wakely jwakely@redhat.com
Sat Mar 27 19:44:41 GMT 2021


On 26/03/21 02:50 -0300, Alexandre Oliva wrote:
>
>The calibration loop I've recently added to the libstdc++
>future/members/poll.cc tests could still select iteration counts that
>might yield zero-time measurements for the wait_for when ready loop.
>
>Waiting for a future that has already had a value set is presumably
>uniformly faster than a zero-timed wait for a result,

On trunk and gcc-10 branch yes, but not in any released version.

>so I've changed
>the calibration loop to use the former.
>
>
>We might still be unlucky and get nonzero from the initial loop, so
>that the calibration is skipped altogether, but then get zero from the
>later when-ready loop.  I'm not dealing with this case in this patch.
>
>
>In gcc-10 testing, I also had to bump up some multipliers from 100 to
>150, but IIUC there have been changes for GCC 11 that will hopefully
>render those unnecessary, so I'm leaving them out.

Yes, the relative performance of different future ops are quite
different on trunk.

>Regstrapped on x86_64-linux-gnu and cross-tested for x86_64-vx7r2 along
>with other patches, mostly for the testsuite.  Ok to install?

OK, thanks.

>for  libstdc++-v3/ChangeLog
>
>	* testsuite/30_threads/future/members/poll.cc: Use faster
>	after-ready call in the calibration loop.
>---
> .../testsuite/30_threads/future/members/poll.cc    |    8 +++++++-
> 1 file changed, 7 insertions(+), 1 deletion(-)
>
>diff --git a/libstdc++-v3/testsuite/30_threads/future/members/poll.cc b/libstdc++-v3/testsuite/30_threads/future/members/poll.cc
>index 133dae15ac471..4c846d0b7baf5 100644
>--- a/libstdc++-v3/testsuite/30_threads/future/members/poll.cc
>+++ b/libstdc++-v3/testsuite/30_threads/future/members/poll.cc
>@@ -55,6 +55,12 @@ int main()
>      Attempt to calibrate it.  */
>   if (start == stop)
>     {
>+      /* After set_value, wait_for is faster, so use that for the
>+	 calibration to avoid zero at low clock resultions.  */
>+      promise<int> pc;
>+      future<int> fc = pc.get_future();
>+      pc.set_value(1);
>+
>       /* Loop until the clock advances, so that start is right after a
> 	 time increment.  */
>       do
>@@ -65,7 +71,7 @@ int main()
> 	 after another time increment.  */
>       do
> 	{
>-	  f.wait_for(chrono::seconds(0));
>+	  fc.wait_for(chrono::seconds(0));
> 	  stop = chrono::high_resolution_clock::now();
> 	  i++;
> 	}
>
>
>-- 
>Alexandre Oliva, happy hacker  https://FSFLA.org/blogs/lxo/
>   Free Software Activist         GNU Toolchain Engineer
>        Vim, Vi, Voltei pro Emacs -- GNUlius Caesar
>



More information about the Libstdc++ mailing list