cvs commit: fptools/ghc/rts Schedule.c
simonmar at microsoft.com
Thu Feb 26 12:40:38 EST 2004
> > simonmar 2004/02/25 09:35:45 PST
> > Modified files:
> > ghc/rts Schedule.c
> > Log:
> > Feeble performance hack for the threaded RTS: instead of
> > allocating/releasing a new condition variable for each
> new call-in,
> > we
> > just cache one in the RTS and re-use it for the next call.
> So now the non-threaded RTS doesn't build because there's an #ifdef
> missing (type Condition isn't defined). That's easy to fix.
> But the threaded RTS breaks on Mac OS X and probably on other
> platforms because the Condition type is _not_ a pointer but a struct
> and therefore can't be initialized to NULL.
Fixed now, it was a bit late in the day when I made that change :-(
> > On a little test I have here which does lots of call-ins
> on Windows,
> > this reduces the slowdown for using the threaded RTS from
> a factor of
> > 7-8 down to a factor of 4-5. I'm aiming for a factor of 2 or
> > better...
> I assume that test doesn't work without Visual Studio and therefore
> can't be run on other platforms?
> By the way, on Mac OS X, initCondition a.k.a.
> pthread_cond_init does no
> syscall and takes about fifteen instructions in total :-) .
The test works fine on other platforms (it's just a tight loop in C
calling a foreign exported 'return ()'), but I expect the performance
behaviour differs between platforms (as you mentioned), and Windows is
the platform I care about at the moment. I haven't measured the
overhead on Linux yet, but will do so later...
The test is running without any worker threads in the system. With a
worker thread I expect there to more overhead, because the worker will
be sitting in awaitEvent() with a capability, which it needs to hand
over to the thread doing the call-in. I'm planning to experiment with
releasing the capability before awaitEvent() if EMPTY_RUN_QUEUE.
Also, I'm not sure that the storage manager's mutex is required.
Instead, we could just assume that the storage manager is only available
to a thread with a Capability (or the garbage collector, which
notionally runs with a Capability).
More information about the Cvs-ghc