[zeromq-dev] Parallel sort

Martin Sustrik sustrik at moloch.sk
Mon Aug 16 01:02:30 CEST 2010

On 08/03/2010 03:07 AM, Pieter Hintjens wrote:
> There are certainly ways to map a very large virtual tree onto a 
> smaller number of real worker threads. It just requires some passing 
> of state up and down. Grab state, decide whether to split or execute, 
> return results, repeat. Would work with stateless workers and all 
> state concentrated in one dispatcher.
Yes. Conflating the tree to limited number of workers is easy:

Have one queue device, N workers, each worker looks like this:

socket_t parent (ctx, ZMQ_REP);
parent.connect (queue);
sokcet_t child1 (ctx, ZMQ_REQ);
child1.connect (queue);
socket_t child2 (ctx, ZMQ_REQ);
child2.connect (queue);
while (true) {
     request = patent.recv ();
     child1.send (split_left (request));
     child2.send (split_right (request));
     left = child1.recv ();
     right = child2.recv ();
     parent.send (join (left, right));

Looks good, but will end up deadlocked in any non-trivial case :(

To prevent hangups components would have to be able to process multiple 
request in parallel, which means storing state. Storing state in turn 
means loosing scalability.

My gut feeling is that scalability and recursive algorithms are 
inherently incompatible.

One option would be to rewrite the sort in iterative (rather than 
recursive) manner and apply divide and conquer approach on the result.


More information about the zeromq-dev mailing list