benchtests: Add pthread_once common-case test.

We have a single thread that runs a no-op initialization once and then
repeatedly runs checks of the initialization (i.e., an acquire load and
conditional jump) in a tight loop.  This gives us, on average, the
best-case latency of pthread_once (the initialization is the
exactly-once slow path, and we're not looking at initialization-related
synchronization overheads in this case).
This commit is contained in:
Torvald Riegel 2013-10-08 14:17:01 +03:00
parent a4c75cfd56
commit 6a5d6ea128
5 changed files with 44 additions and 1 deletions

View file

@ -1,3 +1,9 @@
2014-04-10 Torvald Riegel <triegel@redhat.com>
* benchtests/pthread_once-inputs: New file.
* benchtests/pthread_once-source.c: New file.
* benchtests/README: Update documentation.
2014-04-09 Igor Zamyatin <igor.zamyatin@intel.com> 2014-04-09 Igor Zamyatin <igor.zamyatin@intel.com>
H.J. Lu <hongjiu.lu@intel.com> H.J. Lu <hongjiu.lu@intel.com>

View file

@ -23,7 +23,7 @@ subdir := benchtests
include ../Makeconfig include ../Makeconfig
bench := acos acosh asin asinh atan atanh cos cosh exp exp2 ffs ffsll \ bench := acos acosh asin asinh atan atanh cos cosh exp exp2 ffs ffsll \
log log2 modf pow rint sin sincos sinh sqrt tan tanh log log2 modf pow pthread_once rint sin sincos sinh sqrt tan tanh
# String function benchmarks. # String function benchmarks.
string-bench := bcopy bzero memccpy memchr memcmp memcpy memmem memmove \ string-bench := bcopy bzero memccpy memchr memcmp memcpy memmem memmove \
@ -53,6 +53,7 @@ LDLIBS-bench-exp2 = -lm
LDLIBS-bench-log = -lm LDLIBS-bench-log = -lm
LDLIBS-bench-log2 = -lm LDLIBS-bench-log2 = -lm
LDLIBS-bench-pow = -lm LDLIBS-bench-pow = -lm
LDLIBS-bench-pthread_once = -lpthread
LDLIBS-bench-rint = -lm LDLIBS-bench-rint = -lm
LDLIBS-bench-sin = -lm LDLIBS-bench-sin = -lm
LDLIBS-bench-sinh = -lm LDLIBS-bench-sinh = -lm

View file

@ -60,6 +60,8 @@ one to add `foo' to the bench tests:
- include-sources: This should be assigned a comma-separated list of source - include-sources: This should be assigned a comma-separated list of source
files that need to be included to provide definitions of global variables files that need to be included to provide definitions of global variables
and functions (specifically, this includes using "#include "source"). and functions (specifically, this includes using "#include "source").
See pthread_once-inputs and pthreads_once-source.c for an example of how
to use this to benchmark a function that needs state across several calls.
- name: See following section for instructions on how to use this directive. - name: See following section for instructions on how to use this directive.
Lines beginning with a single hash '#' are treated as comments. See Lines beginning with a single hash '#' are treated as comments. See

View file

@ -0,0 +1,9 @@
# This tests the common-case scenario for pthread_once.
# We have a single thread that runs a no-op initialization once and then
# repeatedly runs checks of the initialization (i.e., an acquire load and
# conditional jump) in a tight loop.
# scripts/bench.py doesn't handle function pointers, so we just use void *:
## args: pthread_once_t *:void *
## includes: pthread.h
## include-sources: pthread_once-source.c
&once, once_handler

View file

@ -0,0 +1,25 @@
/* Measure pthread_once best-case latency (i.e., when already initialized.
Copyright (C) 2014 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
static pthread_once_t once = PTHREAD_ONCE_INIT;
static void
once_handler (void)
{
}