Re: CPUs, thread pools, and wasted time.
Ken wrote:
I'm trying to build an application that will use multiple cores
efficiently, but I'm running into to some difficulties. I've written a
simple small example to demonstrate the problem and attached it below.
When I run this program on my dual core computer I expect that both cores
should be actively running wasteTime() and my CPU utilization should be
nearly 100% on both, but this isn't the result I'm getting. A single CPU
is maxed out and the other one is sitting idle. This isn't what I want
for obvious reasons.
Thread scheduling is handled at OS-level. It is impossible to bind the
Java threads to separate CPUs using only native code; I do not know
whether it is even possible to bind threads to CPUs at below a process
level.
Can any explain to me why this is happening and what to do about it?
I know that one can fiddle with the amount of work done by each thread and
get it to behave correctly, but I don't know why it isn't behaving
correctly without this tweaking of parameters.
Thanks.
public static double wasteTime() {
double sum = 0.0;
for (int index = 0; index < 100; index++) {
sum += Math.cos(index / 1000.0);
}
return sum;
}
This is hardly going to be wasting fair amounts of time. Assuming that
computing the cosine takes as many as 20 FLOPs, this code would be on
the order of ~2000 FLOPs. Try computing some eigenvalues or solving
simple ordinary differential equations to REALLY waste time.
I am merely hypothesizing here, but it could be that you wasteTime is
sufficiently computationally nonintensive that the OS is deciding that
it is worthwhile to use the one core.
--
Beware of bugs in the above code; I have only proved it correct, not
tried it. -- Donald E. Knuth