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.