menu

hjk41的日志

Avatar

simple implementation of all to all communication using send/recv

I was writing a Pregel framework for SCC when I encountered the problem of all to all communication. I used RCCE communication library as the underlying communication. However, RCCE provides very limited functionality, not much aside from blocking send/recv actually. Pregel requires all to all communication to exchange the messages sent from vertexes. That's why I started searching for a way to implement all to all communication using send/recv.

After googling for a while, I find that most of the algorithms are just too complex for me. So I dug into the RCCE_Comm library, which provides a RCCE_Alltoall function to perform all to all communication on fixed size data structures. The code seems very straightforward, and I gladly used the same algorithm in my implementation.

Here is the code snippets:


    int np=get_num_workers();
    int me=get_worker_id();
    for(int i=0;i<np;i++){
        int partner=(i-me+np)%np;
        if( me!=partner ){
            if( me<partner ){
                send( send_buf, send_size, partner );
                recv( recv_buf, recv_size, partner );
            }
            else{
                recv( recv_buf, recv_size, partner );   
                send( send_buf, send_size, partner );             
            }
        }
    }