I am asking myself, if the evaluation of a function f
looking for a minimal value over a discrete set of values can be parallelize (brute scan for a potential minimal value over a rectangular region with specified resolution). Is it possible or just not suitable for parallel computing do to the need to always compare to a reference which needs to happen in the main kernel? As far as I understood it in
Why won't Parallelize speed up my code?
the forced evaluation in the main kernel with SetSharedVariable
can cause a significant lost in speed, which I think is the case in my horribly parallelized evaluation (see below). Any suggestions? I am pretty sure, I am just not seeing the obvious perspective. I dont want to use NMinimize, I only want to scan rapidly (if possible also in parallel) a rectangular region with specified resolution and pick up the minimal value. Sorry, if this is a duplicate, I was not able to find an answer. Thanks.
Minimal example:
Function:
f = Sin[x - z + Pi/4] + (y - 2)^2 + 13;
Sequential evaluation with do:
Clear[fmin]
fmin
n = 10^1*2;
fmin = f /. {x -> 0, y -> 0, z -> 0};
fmin // N
start = DateString[]
Do[
ftemp = f /. {x -> xp, y -> yp, z -> zp};
If[ftemp < fmin, fmin = ftemp];
, {xp, 0, Pi, Pi/n}
, {yp, -2, 4, 6/n}
, {zp, -Pi, Pi, 2*Pi/n}
]
end = DateString[]
DateDifference[start, end, {"Minute", "Second"}]
fmin // N
Horribly parallelized evaluation
Clear[fmin]
fmin
n = 10^1*2;
fmin = f /. {x -> 0, y -> 0, z -> 0};
fmin // N
SetSharedVariable[fmin];
start = DateString[]
ParallelDo[
ftemp = f /. {x -> xp, y -> yp, z -> zp};
If[ftemp < fmin, fmin = ftemp];
, {xp, 0, Pi, Pi/n}
, {yp, -2, 4, 6/n}
, {zp, -Pi, Pi, 2*Pi/n}
]
end = DateString[]
DateDifference[start, end, {"Minute", "Second"}]
fmin // N
Answer
Don't compare to a single (shared) main-kernel variable (fmin
) on each kernel. Instead, allow each kernel to find the smallest of the points it has checked. Let each kernel have its own private fmin
. Then you'll have $KernelCount
candidates for the minimum. Finally select the smallest of these.
ParallelCombine
is made for precisely this type of approach. It may be a good idea to use Method -> "CoarsestGrained"
.
Comments
Post a Comment