Thanks. That does help. I'm still having problems making it all work, but I think I need to prepare a minimalist example that illustrates what I want to do. I'll post a new thread with an example later.
Cheers, Daniel. On Tuesday, 16 June 2015 22:28:22 UTC+2, Avik Sengupta wrote: > > The following is an informal description, please don't take it as ground > truth... > > So @async will start a job and return, without waiting for the result of > that job being available. So, in the code above, the real work is being > done in the remotecall_fetch, which runs a function "f" in the remote > process. Due to the @async, the "while true" loop will continue as soon as > the function is sent to the remote process, without waiting for its result > to be passed back. > > When the "while true" loop is completed, you dont then want to return out > of the "pmap" function, since the remote functions may not yet have > finished. At that point, you want to wait till all the jobs that you have > started do finish. That is what @sync does. It waits for all @async jobs to > have finished before continuing. Hence, you will typically (though not > always) see @sync/@async pairs. > > Hope that helps. > > Regards > - > Avik > > > On Tuesday, 16 June 2015 20:22:07 UTC+1, Daniel Carrera wrote: >> >> Hello, >> >> I have been looking at the documentation for parallel programming, with >> special interest in SharedArrays. But no matter how hard I try, I cannot >> get a clear picture of what @sync and @async do. I think they are not >> really explained anywhere. Maybe they are explained somewhere and I just >> haven't found it. To make my question concrete, here is the implementation >> of pmap: >> >> function pmap(f, lst) >> np = nprocs() # determine the number of processes available >> n = length(lst) >> results = cell(n) >> i = 1 >> # function to produce the next work item from the queue. >> # in this case it's just an index. >> nextidx() = (idx=i; i+=1; idx) >> @sync begin >> for p=1:np >> if p != myid() || np == 1 >> @async begin >> while true >> idx = nextidx() >> if idx > n >> break >> end >> results[idx] = remotecall_fetch(p, f, lst[idx]) >> end >> end >> end >> end >> end >> resultsend >> >> >> >> >> Can someone help me understand how this function works? In particular, >> what do @sync and @async do? >> >> Thanks for the help. >> >> Cheers, >> Daniel >> >
