Yes, I read the code, but I'm not sure I understand what the let statement is doing. It's trying to redefine the scope of the variable, or create a new variable with the same value but over a different scope? How does the let statement interact with the namespaces of the various processes?
On Sat, Nov 22, 2014 at 10:30 PM, Amit Murthy <amit.mur...@gmail.com> wrote: > From the description of Base.localize_vars - 'wrap an expression in "let > a=a,b=b,..." for each var it references' > > Though that does not seem to the only(?) issue here.... > > On Sun, Nov 23, 2014 at 11:52 AM, Madeleine Udell < > madeleine.ud...@gmail.com> wrote: > >> Thanks! This is extremely helpful. >> >> Can you tell me more about what localize_vars does? >> >> On Sat, Nov 22, 2014 at 9:11 PM, Amit Murthy <amit.mur...@gmail.com> >> wrote: >> >>> This works: >>> >>> function doparallelstuff(m = 10, n = 20) >>> # initialize variables >>> localX = Base.shmem_rand(m; pids=procs()) >>> localY = Base.shmem_rand(n; pids=procs()) >>> localf = [x->i+sum(x) for i=1:m] >>> localg = [x->i+sum(x) for i=1:n] >>> >>> # broadcast variables to all worker processes >>> @sync begin >>> for i in procs(localX) >>> remotecall(i, x->(global X; X=x; nothing), localX) >>> remotecall(i, x->(global Y; Y=x; nothing), localY) >>> remotecall(i, x->(global f; f=x; nothing), localf) >>> remotecall(i, x->(global g; g=x; nothing), localg) >>> end >>> end >>> >>> # compute >>> for iteration=1:1 >>> @everywhere for i=localindexes(X) >>> X[i] = f[i](Y) >>> end >>> @everywhere for j=localindexes(Y) >>> Y[j] = g[j](X) >>> end >>> end >>> end >>> >>> doparallelstuff() >>> >>> Though I would have expected broadcast of variables to be possible with >>> just >>> @everywhere X=localX >>> and so on .... >>> >>> >>> Looks like @everywhere does not call localize_vars. I don't know if >>> this is by design or just an oversight. I would have expected it to do so. >>> Will file an issue on github. >>> >>> >>> >>> On Sun, Nov 23, 2014 at 8:24 AM, Madeleine Udell < >>> madeleine.ud...@gmail.com> wrote: >>> >>>> The code block I posted before works, but throws an error when embedded >>>> in a function: "ERROR: X not defined" (in first line of @parallel). Why am >>>> I getting this error when I'm *assigning to* X? >>>> >>>> function doparallelstuff(m = 10, n = 20) >>>> # initialize variables >>>> localX = Base.shmem_rand(m) >>>> localY = Base.shmem_rand(n) >>>> localf = [x->i+sum(x) for i=1:m] >>>> localg = [x->i+sum(x) for i=1:n] >>>> >>>> # broadcast variables to all worker processes >>>> @parallel for i=workers() >>>> global X = localX >>>> global Y = localY >>>> global f = localf >>>> global g = localg >>>> end >>>> # give variables same name on master >>>> X,Y,f,g = localX,localY,localf,localg >>>> >>>> # compute >>>> for iteration=1:1 >>>> @everywhere for i=localindexes(X) >>>> X[i] = f[i](Y) >>>> end >>>> @everywhere for j=localindexes(Y) >>>> Y[j] = g[j](X) >>>> end >>>> end >>>> end >>>> >>>> doparallelstuff() >>>> >>>> On Fri, Nov 21, 2014 at 5:13 PM, Madeleine Udell < >>>> madeleine.ud...@gmail.com> wrote: >>>> >>>>> My experiments with parallelism also occur in focused blocks; I think >>>>> that's a sign that it's not yet as user friendly as it could be. >>>>> >>>>> Here's a solution to the problem I posed that's simple to use: >>>>> @parallel + global can be used to broadcast a variable, while @everywhere >>>>> can be used to do a computation on local data (ie, without resending the >>>>> data). I'm not sure how to do the variable renaming programmatically, >>>>> though. >>>>> >>>>> # initialize variables >>>>> m,n = 10,20 >>>>> localX = Base.shmem_rand(m) >>>>> localY = Base.shmem_rand(n) >>>>> localf = [x->i+sum(x) for i=1:m] >>>>> localg = [x->i+sum(x) for i=1:n] >>>>> >>>>> # broadcast variables to all worker processes >>>>> @parallel for i=workers() >>>>> global X = localX >>>>> global Y = localY >>>>> global f = localf >>>>> global g = localg >>>>> end >>>>> # give variables same name on master >>>>> X,Y,f,g = localX,localY,localf,localg >>>>> >>>>> # compute >>>>> for iteration=1:10 >>>>> @everywhere for i=localindexes(X) >>>>> X[i] = f[i](Y) >>>>> end >>>>> @everywhere for j=localindexes(Y) >>>>> Y[j] = g[j](X) >>>>> end >>>>> end >>>>> >>>>> On Fri, Nov 21, 2014 at 11:14 AM, Tim Holy <tim.h...@gmail.com> wrote: >>>>> >>>>>> My experiments with parallelism tend to occur in focused blocks, and >>>>>> I haven't >>>>>> done it in quite a while. So I doubt I can help much. But in general >>>>>> I suspect >>>>>> you're encountering these problems because much of the IPC goes >>>>>> through >>>>>> thunks, and so a lot of stuff gets reclaimed when execution is done. >>>>>> >>>>>> If I were experimenting, I'd start by trying to create RemoteRef()s >>>>>> and put! >>>>>> ()ing my variables into them. Then perhaps you might be able to fetch >>>>>> them >>>>>> from other processes. Not sure that will work, but it seems to be >>>>>> worth a try. >>>>>> >>>>>> HTH, >>>>>> --Tim >>>>>> >>>>>> On Thursday, November 20, 2014 08:20:19 PM Madeleine Udell wrote: >>>>>> > I'm trying to use parallelism in julia for a task with a structure >>>>>> that I >>>>>> > think is quite pervasive. It looks like this: >>>>>> > >>>>>> > # broadcast lists of functions f and g to all processes so they're >>>>>> > available everywhere >>>>>> > # create shared arrays X,Y on all processes so they're available >>>>>> everywhere >>>>>> > for iteration=1:1000 >>>>>> > @parallel for i=1:size(X) >>>>>> > X[i] = f[i](Y) >>>>>> > end >>>>>> > @parallel for j=1:size(Y) >>>>>> > Y[j] = g[j](X) >>>>>> > end >>>>>> > end >>>>>> > >>>>>> > I'm having trouble making this work, and I'm not sure where to dig >>>>>> around >>>>>> > to find a solution. Here are the difficulties I've encountered: >>>>>> > >>>>>> > * @parallel doesn't allow me to create persistent variables on each >>>>>> > process; ie, the following results in an error. >>>>>> > >>>>>> > s = Base.shmem_rand(12,3) >>>>>> > @parallel for i=1:nprocs() m,n = size(s) end >>>>>> > @parallel for i=1:nprocs() println(m) end >>>>>> > >>>>>> > * @everywhere does allow me to create persistent variables on each >>>>>> process, >>>>>> > but doesn't send any data at all, including the variables I need in >>>>>> order >>>>>> > to define new variables. Eg the following is an error: s is a >>>>>> shared array, >>>>>> > but the variable (ie pointer to) s is apparently not shared. >>>>>> > s = Base.shmem_rand(12,3) >>>>>> > @everywhere m,n = size(s) >>>>>> > >>>>>> > Here are the kinds of questions I'd like to see protocode for: >>>>>> > * How can I broadcast a variable so that it is available and >>>>>> persistent on >>>>>> > every process? >>>>>> > * How can I create a reference to the same shared array "s" that is >>>>>> > accessible from every process? >>>>>> > * How can I send a command to be performed in parallel, specifying >>>>>> which >>>>>> > variables should be sent to the relevant processes and which should >>>>>> be >>>>>> > looked up in the local namespace? >>>>>> > >>>>>> > Note that everything I ask above is not specific to shared arrays; >>>>>> the same >>>>>> > constructs would also be extremely useful in the distributed case. >>>>>> > >>>>>> > ---------------------- >>>>>> > >>>>>> > An interesting partial solution is the following: >>>>>> > funcs! = Function[x->x[:] = x+k for k=1:3] >>>>>> > d = drand(3,12) >>>>>> > let funcs! = funcs! >>>>>> > @sync @parallel for k in 1:3 >>>>>> > funcs![myid()-1](localpart(d)) >>>>>> > end >>>>>> > end >>>>>> > >>>>>> > Here, I'm not sure why the let statement is necessary to send >>>>>> funcs!, since >>>>>> > d is sent automatically. >>>>>> > >>>>>> > --------------------- >>>>>> > >>>>>> > Thanks! >>>>>> > Madeleine >>>>>> >>>>>> >>>>> >>>>> >>>>> -- >>>>> Madeleine Udell >>>>> PhD Candidate in Computational and Mathematical Engineering >>>>> Stanford University >>>>> www.stanford.edu/~udell >>>>> >>>> >>>> >>>> >>>> -- >>>> Madeleine Udell >>>> PhD Candidate in Computational and Mathematical Engineering >>>> Stanford University >>>> www.stanford.edu/~udell >>>> >>> >>> >> >> >> -- >> Madeleine Udell >> PhD Candidate in Computational and Mathematical Engineering >> Stanford University >> www.stanford.edu/~udell >> > > -- Madeleine Udell PhD Candidate in Computational and Mathematical Engineering Stanford University www.stanford.edu/~udell