9fans - fans of the OS Plan 9 from Bell Labs
 help / color / mirror / Atom feed
From: erik quanstrom <quanstro@quanstro.net>
To: 9fans@9fans.net
Subject: [9fans] userspace semlocks
Date: Sat, 21 Sep 2013 22:55:06 -0400	[thread overview]
Message-ID: <64cc61c082febe489ac3244473bb4ca4@brasstown.quanstro.net> (raw)

[-- Attachment #1: Type: text/plain, Size: 810 bytes --]

when i measure chan send performance with the attached program with
the semaphore locks that have been made the default for sources and
with the old locks, the old locks surprisingly outperform the new ones
by a large margin.

the test is let O be the number of buffers in the channel, and M be
the number of sending procs, then cycles is the number of machine
cycles required to send 1<<21 messages per proc, and receive them
on a single listener.

on my machine, i get the following raw numbers (averaged over a few tries):

	new	1.84e9 cycles	O=10	M=1
	old	1.10e9

	new	4.61e9		O=0	M=1
	old	4.38e9

	new	1.55e10		O=10	M=8
	old	2.74e10

	new	3.64e10		O=0	M=8
	old	5.14e10

am i doing something fundamental wrong, or are the new locks substantially
slower than the old ones?

- erik

[-- Attachment #2: chantest.c --]
[-- Type: text/plain, Size: 1043 bytes --]

#include <u.h>
#include <libc.h>
#include <thread.h>

enum {
	Ndflt	= 1<<21,
	Mdflt	= 1,
	Odflt	= 10,
};

N	= Ndflt;
M	= Mdflt;
O	= Odflt;

Channel *c, *endc;

void
sendthread(void*)
{
	ulong i;

	for(i = 0; i < N; i++)
		sendul(c, i);
	threadexits("");
}

void
receivethread(void*)
{
	int i;

	for(i = 0; i <N*M; i++)
		recvul(c);
	sendul(endc, 1);
	threadexits("");
}

void
usage(void)
{
	fprint(2, "usage: chantest [-O nbuf] [-M nproc]\n");
	exits("usage");
}

void
threadmain(int argc, char **argv)
{
	int i;
	uvlong t;

	ARGBEGIN{
	default:
		usage();
	case 'M':
		M = atoi(EARGF(usage()));
		break;
	case 'O':
		O = atoi(EARGF(usage()));
		break;
	}ARGEND
	if(argc > 0)
		usage();

	t = -nsec();
	c = chancreate(sizeof(ulong), O);
	endc = chancreate(sizeof(ulong), 0);

	proccreate(receivethread, nil, 4*1024);
	for(i = 0; i < M; i++)
		proccreate(sendthread, (void*)(uintptr)i, 4*1024);

	recvul(endc);
	t += nsec();

	print("%lld\n", t);

	threadexits("");
}

             reply	other threads:[~2013-09-22  2:55 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-09-22  2:55 erik quanstrom [this message]
2013-09-22  5:48 ` Bruce Ellis
2013-09-23 13:56   ` erik quanstrom
2013-09-23 21:11 ` Charles Forsyth
2013-09-23 21:19   ` erik quanstrom
2013-09-23 22:27     ` erik quanstrom

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=64cc61c082febe489ac3244473bb4ca4@brasstown.quanstro.net \
    --to=quanstro@quanstro.net \
    --cc=9fans@9fans.net \
    /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.
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).