On Jun 8, 2012, at 6:43 AM, BOUVIER Benjamin wrote: > # include <mpi.h> > # include <stdio.h> > # include <string.h> > > int main(int argc, char **argv) > { > int rank, size; > const char someString[] = "Can haz cheezburgerz?"; > > MPI_Init(&argc, &argv); > > MPI_Comm_rank( MPI_COMM_WORLD, & rank ); > MPI_Comm_size( MPI_COMM_WORLD, & size ); > > if ( rank == 0 ) > { > int len = strlen( someString ); > int i; > for( i = 1; i < size; ++i) > { > MPI_Send( &len, 1, MPI_INT, i, 0, MPI_COMM_WORLD ); > MPI_Send( &someString, len+1, MPI_CHAR, i, 0, MPI_COMM_WORLD ); > } > } else { > char buffer[ 128 ]; > int receivedLen; > MPI_Status stat; > MPI_Recv( &receivedLen, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &stat ); > printf( "[Worker] Length : %d\n", receivedLen ); > MPI_Recv( buffer, receivedLen+1, MPI_CHAR, 0, 0, MPI_COMM_WORLD, > &stat); > printf( "[Worker] String : %s\n", buffer ); > } > > MPI_Finalize(); > }
I don't see anything obviously wrong with this code. > I know that there is a better way to send a string, by giving a maximum > buffer size at the second MPI_Recv, but there is no the main topic here. > The launch works locally (i.e when the 2 processes are launched on one > machine), but doesn't work when the 2 processes are dispatched in 2 machines > through network (i.e one per host). In this case, the worker correctly reads > the INT, and then master and worker block on the next call. That's very odd. > I have no issue when sending only char strings or only numbers. This only > happens when sending char strings then numbers, or in the other order. That's even more odd. Can you run standard benchmarks like MPI net pipe, and/or the OSU benchmarks? (across multiple nodes, that is) -- Jeff Squyres jsquy...@cisco.com For corporate legal information go to: http://www.cisco.com/web/about/doing_business/legal/cri/