Re: Re: ParrallelDo and set::noval
- To: mathgroup at smc.vnet.net
- Subject: [mg102742] Re: [mg102697] Re: ParrallelDo and set::noval
- From: Patrick Scheibe <pscheibe at trm.uni-leipzig.de>
- Date: Tue, 25 Aug 2009 01:45:07 -0400 (EDT)
- References: <h63cgg$1b6$1@smc.vnet.net> <h6duf8$h1c$1@smc.vnet.net>
Hi,
you only missed *how* the definitions are distributed. I give an example
and you should see the rest by yourself:
k := {1, 2, 3, 4}
k[[3]] = 2
ups, what happens here?
Cheers
Patrick
On Mon, 2009-08-24 at 20:30 +0200, Fred Simons wrote:
> 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
>