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