This indeed seems like a good addition. I'm not aware yet of a place in 
sage where something like this is done.

I would chose a different name though, something like "bundled_parallel", 
because naming this one unordered seems to indirectly imply that the other 
one is ordered, which it is absolutely not.

Le vendredi 21 juin 2013 14:28:14 UTC+2, Timo Kluck a écrit :
>
> Hi everyone,
>
> I just parallelized a for loop in a way that may be generally useful, and 
> I'm wondering whether I should write an addition to sage.parallel. It's 
> possible that this has been done already and in much better ways than my 
> own, so I'd be very happy to hear your opinions.
>
> I had a for loop of the form
>
>   for i in iterator:
>        # do some stuff
>        # eventually result <- f(i)
>        yield result
>
> for some "long" iterator and a "short" computation i -> f(i).
>
> I tried to parallelize this using @parallel, but the result wasn't any 
> quicker:
>
>   @parallel()
>   def f(i):
>       # do some stuff
>       return result
>   for res in f(iterator):
>       yield res[1]
>
> My guess about the lack of speed-up is that every iteration introduces 
> pickling and forking overhead, which adds up to a lot, collectively.
>
> I tried to mitigate this overhead by not forking for every iteration, but 
> by starting a fork for every cpu and then having that fork loop over its 
> own slice of the iterator:
>
>   @parallel('fork')
>   def do_computation(start):
>       result = []
>       for args in itertools.islice(iterator, start, None, 
> number_of_chunks):
>           result.append(function(args))
>       return result
>
>   results = do_computation(range(number_of_chunks))
>   for res in results:
>       for r in res[1]:
>           yield r
>
> This resulted in the expected speedup (~3x for ncpus=4).
>
> I collected this functionality in a decorator @unordered_parallel that 
> lets you replace
>
>   for i in iterator:
>       yield f(i)
>
> by
>
>   @unordered_parallel(iterator, number_of_chunks)
>   def _(i):
>       return f(i)
>   for res in _: yield res
>   
> (As a side note: I'm really happy with how the interface lets you 
> parallelize your
> for loop while hardly changing its body.)  
>
> Would there be any interest in an addition along these lines to the 
> sage.parallel module?
>
> Best, Timo
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"sage-devel" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sage-devel+unsubscr...@googlegroups.com.
To post to this group, send email to sage-devel@googlegroups.com.
Visit this group at http://groups.google.com/group/sage-devel.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to