Providing Fairness (Fortran)


Up: Buffering issues Next: Exercise - Fairness Previous: Providing Fairness

One alternative is


parameter( large = 128 ) 
   integer requests(large); 
   integer statuses(MPI_STATUS_SIZE,large); 
   integer indices(large); 
   integer buf(large); 
   logical done 
   do 10 i = 1,size-1 
10 call MPI_Irecv( buf(i), 1, MPI_INTEGER, i, 
  *            MPI_ANY_TAG, MPI_COMM_WORLD, requests(i), ierr ) 
20 if (.not. done) then 
    call MPI_Waitsome( size-1, requests, ndone,  
                       indices, statuses, ierr ) 
    do 30 i=1, ndone 
        j = indices(i) 
        print *, 'Msg from ', statuses(MPI_SOURCE,i), ' with tag', 
     *               statuses(MPI_TAG,i) 
        call MPI_Irecv( buf(j), 1, MPI_INTEGER, j, 
                   MPI_ANY_TAG, MPI_COMM_WORLD, requests(j), ierr ) 
        done = ... 
30  continue 
    goto 20 
    endif 



Up: Buffering issues Next: Exercise - Fairness Previous: Providing Fairness