From: Rich Felker <dalias@libc.org>
To: musl@lists.openwall.com
Subject: Re: [PATCH] private futex support
Date: Fri, 8 Aug 2014 21:50:13 -0400 [thread overview]
Message-ID: <20140809015013.GX1674@brightrain.aerifal.cx> (raw)
In-Reply-To: <20140808113857.1839babf@vostro>
[-- Attachment #1: Type: text/plain, Size: 2347 bytes --]
On Fri, Aug 08, 2014 at 11:38:57AM +0300, Timo Teras wrote:
> > actually commit it. If anyone is interested in this feature, please
> > see if you can find some examples that demonstrate that it measurably
> > improves performance.
>
> And running my simple test-case of having two threads wake up each
> other using a condition variable, seems to yield noticeable performance
> speed up from private futexes. See at the end of mail for the code.
>
> The low and high numbers from few test runs are as follows from musl
> git 4fe57cad709fdfb377060 without and with the futex patch are as
> follows:
>
> ~/privfutex $ time ~/oss/musl/lib/libc.so ./test
> count=2516417
> real 0m 2.00s
> user 0m 1.68s
> sys 0m 2.30s
>
> ~/privfutex $ time ~/oss/musl/lib/libc.so ./test
> count=2679381
> real 0m 2.00s
> user 0m 1.59s
> sys 0m 2.39s
>
> Private futexes:
>
> ~/privfutex $ time ~/oss/musl/lib/libc.so ./test
> count=3839470
> real 0m 2.00s
> user 0m 1.68s
> sys 0m 1.98s
>
> ~/privfutex $ time ~/oss/musl/lib/libc.so ./test
> count=5350852
> real 0m 2.00s
> user 0m 1.66s
> sys 0m 2.32s
>
>
> You can see essentially lowered sys time use, and up to doubled
> throughput of wait/wake operations.
I was able to match the relative difference (albeit at about 10% of
the total throughput you got for both versions) on my atom.
I also dug up an old test of mine that shows some difference (1.9s vs
2.2s to run). The original point of this test was to demonstrate that
glibc's non-process-shared condvars are 2-2.5x slower than their
process-shared ones (yes, the opposite of what you would expect; see
bug 13234). The code is attached.
> So I suspect your test case was not measuring right thing. Private
> futexes speed up only specific loads, and this type of pthread_cond_t
> usage would probably be the pattern benefiting most.
>
> Please reconsidering adding this after addressing the found
> deficiencies stated in the beginning.
Yes, I think you've succeeded in establishing that private futex
support is useful. So now I just need to check for more stupid
mistakes, get it into a form that's ready to commit, and do some
testing between now and the next release. We should do at least one
test with private futexes hard-wired to fail (or just find an old
kernel to test on) to make sure the fallback code is working, too.
Rich
[-- Attachment #2: cvb2.c --]
[-- Type: text/plain, Size: 1142 bytes --]
#include <stdio.h>
#include <pthread.h>
pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t c = PTHREAD_COND_INITIALIZER;
volatile int p;
int left[5], avail[5], wakes;
void *tf(void *arg)
{
int i = (long)arg;
pthread_mutex_lock(&m);
while (left[i]) {
while (!avail[i]) pthread_cond_wait(&c, &m), wakes++;
left[i]--; avail[i]--;
}
pthread_mutex_unlock(&m);
}
int main()
{
pthread_t td[5];
int i, total;
pthread_mutexattr_t ma;
pthread_mutexattr_init(&ma);
pthread_mutexattr_settype(&ma, PTHREAD_MUTEX_ERRORCHECK);
pthread_condattr_t ca;
pthread_condattr_init(&ca);
pthread_condattr_setpshared(&ca, PTHREAD_PROCESS_SHARED);
//pthread_cond_init(&c, &ca);
//pthread_mutex_init(&m, &ma);
for (i=0; i<5; i++) left[i] = 100000;
for (i=0; i<5; i++) pthread_create(td+i, 0, tf, (void*)(long)i);
pthread_mutex_lock(&m);
for (;;) {
for (total=i=0; i<5; i++) total+=left[i];
if (!total) break;
for (i=0; i<5; i++) avail[i]=1;
pthread_cond_broadcast(&c);
pthread_mutex_unlock(&m);
pthread_mutex_lock(&m);
}
pthread_mutex_unlock(&m);
for (i=0; i<5; i++) pthread_join(td[i], 0);
printf("%d\n", wakes);
}
prev parent reply other threads:[~2014-08-09 1:50 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-06-26 18:48 Rich Felker
2014-08-08 8:38 ` Timo Teras
2014-08-09 0:51 ` Rich Felker
2014-08-09 1:50 ` Rich Felker [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20140809015013.GX1674@brightrain.aerifal.cx \
--to=dalias@libc.org \
--cc=musl@lists.openwall.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/musl/
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 NNTP newsgroup(s).