https://github.com/JuliaLang/julia/issues/9118

On Sun, Nov 23, 2014 at 10:41 AM, 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
>>
>
>

Reply via email to