Low-overhead multi-threading? (Was: Re: Increase WinXP/jre CPU usage?)
Patricia Shanahan <pats@acm.org> wrote:
Steve Brecher wrote:
....
OK, so I won't hope for improvement by multi-threading on my P4 with
"Hyper-Threading Technology."
But looking ahead to other hardware...
In a routine called from inner loops -- this routine is called 800
million times in the timing test case I've been using -- I have
something like this (schematically):
for (int i = 0; i < n; i++) {
//n is typically a single-digit value (min 2)
Also, n becomes known at program startup, and its maximum value is a
compile-time constant (22), so any arrays of size<=n can be allocated at
startup.
result[i] = AStaticMethod(arg[i]);
AStaticMethod returns a primitive type.
...
}
What would be the lowest-overhead way to multi-thread the executions
of AStaticMethod?
Rule #1 for optimizing loop nests, commonly followed by optimizing
compilers:
*** Examine the whole loop nest as a unit. ***
An innermost loop with small iteration count is not usually the best
place to begin optimization.
Are you using a "client" or "server" version of Java? My understanding
is that the "server" JVMs do more routine optimizations than the
"client" versions.
I'm using -server.
...
Even without going multi-threaded, many loop nests can be made more
efficient by changing the order of the loops, loop unrolling etc.
(For readers just joining us: I am a Java newbie.)
With respect and thanks, optimization is the not the issue. The code is a
port of long-standing C code that is highly optimized -- I'm very familiar
with optimization techniques; actually, that is my specialty. I'd like to
try multi-threading it.
The loops enumerate cases. For each case, there are "n" significant
computations, each accomplished in AStaticMethod (excuse the initial
upper-case :). Multi-threading the executions of that method would be a
very easy way to begin. Partitioning the enumeration of cases on the other
hand, would be difficult -- at this writing, I don't have a scheme to do
that.
So far my knowledge of Java multi-threading is based on rapid pass through
the relevant material in Flanagan's "Java in a Nutshell" and Sun's "The Java
Tutorials."
If possible, I would like a way to do the multi-threading that creates no
objects for each execution of AStaticMethod. Currently the code, after
startup, creates no objects and incurs no GC.
--
For mail, please use my surname where indicated:
steve@surname.reno.nv.us (Steve Brecher)