Thanks for the tip. Guess I'll go with something along these lines:
module Pmodule
export make_b, use_b
function make_b(n::Int)
global b
b = rand(n,n);
end
function use_b(x::Float64)
use_b_inner(x,b)
end
function use_b_inner(x::Float64, b::Array{Float64})
x + b
end
end
--Peter
On Thursday, February 20, 2014 10:23:37 PM UTC-8, Amit Murthy wrote:
>
> Seems OK. As for the global, you could use this tip from the performance
> section at -
> http://julia.readthedocs.org/en/latest/manual/performance-tips/#avoid-global-variables:
>
> Uses of non-constant globals can be optimized by annotating their types at
> the point of use:
>
> global xy = f(x::Int + 1)
>
>
>
> On Fri, Feb 21, 2014 at 11:34 AM, Peter Simon <[email protected]<javascript:>
> > wrote:
>
>> Thanks for the ideas, Tim and Amit.
>> I was playing around with some simple ideas, and the following seems to
>> work...
>>
>> # The file Pmodule.jl contains
>>
>> module Pmodule
>> export make_b, use_b
>> function make_b(n::Int)
>> global b
>> b = rand(n,n);
>> end
>> function use_b(x::Float64)
>> global b
>> x + b
>> end
>> end
>>
>> Here is an interactive Julia session:
>>
>> julia> pid = addprocs(2)
>> 2-element Array{Any,1}:
>> 2
>> 3
>>
>> julia> @everywhere using Pmodule
>>
>> julia> @everywhere make_b(3)
>>
>> julia> remotecall_fetch(pid[1], use_b, 10.0)
>> 3x3 Array{Float64,2}:
>> 10.1983 10.3043 10.5157
>> 10.3442 10.9273 10.3606
>> 10.0316 10.8404 10.8781
>>
>> julia> remotecall_fetch(pid[2], use_b, 4.0)
>> 3x3 Array{Float64,2}:
>> 4.57154 4.06708 4.07531
>> 4.47332 4.42889 4.07916
>> 4.83437 4.06286 4.19575
>>
>> julia> use_b(6.0)
>> 3x3 Array{Float64,2}:
>> 6.59869 6.75167 6.74789
>> 6.99774 6.22108 6.54333
>> 6.85287 6.7234 6.00127
>>
>> Is this a reasonable way to do it? Will it be inefficient because I'm
>> using a global variable?
>>
>> Thanks,
>> Peter
>>
>>
>> On Thursday, February 20, 2014 7:20:34 PM UTC-8, Amit Murthy wrote:
>>
>>> Since he needs to simultaneously compute b, how about using a DArray
>>> just to store the local copies. Something like:
>>>
>>> d = DArray(init_b_func, (nworkers(), ), workers()) where
>>> init_b_func(indexes) returns initializes and returns a single object of
>>> TypeB . The length of the DArray is the same as the number of workers.
>>>
>>> This is probably not the most canonical use of a DArray, but hey,
>>> references to all instances of b on all processes are kept in the main
>>> process in a single object.
>>> Retrieving b on each of the workers is via localpart(d) .
>>>
>>>
>>>
>>>
>>> On Fri, Feb 21, 2014 at 8:36 AM, Tim Holy <[email protected]> wrote:
>>>
>>>> julia> wpid = addprocs(1)[1]
>>>> 2
>>>>
>>>> julia> rr = RemoteRef(wpid)
>>>> RemoteRef(2,1,5)
>>>>
>>>> julia> put!(rr, "Hello")
>>>> RemoteRef(2,1,5)
>>>>
>>>> julia> fetch(rr)
>>>> "Hello"
>>>>
>>>> --Tim
>>>>
>>>> On Thursday, February 20, 2014 05:20:49 PM Peter Simon wrote:
>>>> > I'm finding myself in need of similar functionality lately. Has any
>>>> > progress been made on this front? In my case, since the large object
>>>> b
>>>> > needs to be computed at run-time, I would prefer to simultaneously
>>>> compute
>>>> > it on all workers at the beginning, then have these copies stick
>>>> around for
>>>> > later reuse. In the Matlab version of the code I'm porting to Julia,
>>>> I do
>>>> > this with persistent variables.
>>>> >
>>>> > Thanks,
>>>> > --Peter
>>>> >
>>>> > On Thursday, December 13, 2012 2:04:12 AM UTC-8, Viral Shah wrote:
>>>> > > Need to wrap up remote_call / remote_call_fetch in a few higher
>>>> level
>>>> > > functions for such things. I'm going to get cracking on improving
>>>> our
>>>> > > parallel support soon.
>>>> > >
>>>> > > -viral
>>>> > >
>>>> > > On Thursday, December 13, 2012 12:29:58 PM UTC+5:30, Miles Lubin
>>>> wrote:
>>>> > >> Seemingly simple question that I haven't managed to figure out
>>>> after
>>>> > >> reading the documentation and playing around: How can you
>>>> broadcast an
>>>> > >> object from one process (say the main process) to all running
>>>> processes?
>>>> > >> I
>>>> > >> come from an MPI background where this is a fundamental operation.
>>>> > >>
>>>> > >> To give an example, say I have a function f(a,b), where b is some
>>>> large
>>>> > >> 100MB+ dataset/matrix/object, and I want to compute f(a,b) for a
>>>> in some
>>>> > >> range and b fixed. It doesn't make sense to send a new copy of b
>>>> with
>>>> > >> each
>>>> > >> call. Instead I'd like to broadcast b to each process and keep a
>>>> > >> persistent
>>>> > >> copy in each process to use during the pmap. What's the best and
>>>> > >> prettiest
>>>> > >> way to do this?
>>>> > >>
>>>> > >> Thanks,
>>>> > >> Miles
>>>>
>>>
>>>
>