Re: Re: ParrallelDo and set::noval
- To: mathgroup at smc.vnet.net
- Subject: [mg102744] Re: [mg102697] Re: ParrallelDo and set::noval
- From: Fred Simons <f.h.simons at tue.nl>
- Date: Tue, 25 Aug 2009 01:45:29 -0400 (EDT)
- References: <h63cgg$1b6$1@smc.vnet.net> <h6duf8$h1c$1@smc.vnet.net> <200908191102.HAA26430@smc.vnet.net>
Many have already reported that the correct way for solving the problem
is using SetSharedVariable instead of DistributeDefinitions.
But part of the original posting was also the observation that
DistributeDefinitions was not enough to make the definition available to
all subkernels. Though in this form that remark is not correct, there is
something strange here that I cannot explain.
As an introduction, start with a fresh kernel and execute the following.
zzz=12;
ParallelEvaluate[zzz=RandomInteger[{0,5}]];
Information[zzz];
ParallelEvaluate[Information[zzz]];
The kernel works in the default context Global` and each subkernel has
its own context Global`, independent of the normal Global context. Since
I use a dual core computer, my output shows three variables zzz, one in
the standard context Global` and two in the two subkernel contexts
Global`. The three values are different, so the three variables are
different, despite that they have the same name and seem to be in the
same context.
Now another variant of the original problem, that produces the
remarkable Set::noval message.
m=Range[5];
DistributeDefinitions[m];
ParallelDo[Print[{i, m, m[[i]]}];m[[i]]=0;Print[m], {i,1,5}]
In the output we see which subkernel tried to do what. The message that
the symbol m in part assignment does not have an immediate value is very
strange, since each subkernel was able to compute both m and m[[i]]. It
seems to be the assignment to m[[i]] that generates the message, for
here are two pieces of code that do work (and of course produce
different values for m in each of the three contexts Global`); they
assign to m instead of to m[[i]].
m=Range[5];
DistributeDefinitions[m];
ParallelDo[Print[{i, m, m[[i]]}];m=ReplacePart[m, i->0];Print[m], {i,1,5}]
m
ParallelEvaluate[m]
m=Range[5];
DistributeDefinitions[m];
ParallelDo[Print[{m,i}];m=Flatten[{Take[m, i-1],0, Drop[m,
i]}];Print[m], {i,1,5}]
m
ParallelEvaluate[m]
Does someone have an explanation why, in this very theoretical
situation, assignment to m is possible and assignment to a part of m not?
Fred Simons
Eindhoven University of Technology
- References:
- Re: ParrallelDo and set::noval
- From: guerom00 <guerom00@gmail.com>
- Re: ParrallelDo and set::noval