Grokking concurrency, message passing and Co

div0 div0 at users.sourceforge.net
Sun Jul 11 11:00:42 PDT 2010


On 11/07/2010 15:28, Philippe Sigaud wrote:

> - Why is a 2 threads version repeatedly thrice as fast as a no thread version?
> I thought it'd be only twice as fast.

Well if you are running on windows, my guess is that your 2nd cpu is 
completely free of tasks, so the thread running on that one is more 
efficient. I'm pretty sure that the windows task scheduler trys as much 
as possible to keep threads running on the last cpu they where on, to 
reduce cache flushes and memory paging.

On your first cpu you'll be paying for the task switching amongst the OS 
threads & programs. Even if they aren't using much actual cpu time, 
there's still a very high cost to perform the task swaps.

Your program is obviously very artificial; with a more normal program 
you'll see the ratio drop back down to less than twice as fast.

> - It's fun to see the process running under windows: first only 50% CPU (1
> thread), then it jumps to ~100%, while the memory is slowly growing. Then
> brutally back to 50% CPU (no thread).
> - 1024 threads are OK, but I cannot reach 2048. Why? What is the limit for the
> number of spawn I can do? Would that be different if each threads spawn two
> sub-threads instead of the main one generating 2048?

How many did you expect to run? Under 'doze each thread by default gets 
a megabyte of virtual address space for it's stack. So at about 1000 
threads you'll be using all of your programs 2GB of address then the 
thread spawn will fail.

Not sure about linux, but a similar limitation must apply.

The rule of thumb is don't bother spawning more threads than you have 
cpus. You're just wasting resources mostly.

Though of course if it makes the program easier to write and maintain 
you may well decide to hell with the wasted resources.

-- 
My enormous talent is exceeded only by my outrageous laziness.
http://www.ssTk.co.uk


More information about the Digitalmars-d-learn mailing list